refactor: apply C++ best practices to platform interfaces

Extract shared types to PlatformTypes.h, add [[nodiscard]] to query
methods, convert file-scope enums to enum class with compat aliases.
This commit is contained in:
MatthewBeshay 2026-03-31 19:57:51 +11:00
parent 5b02454b4f
commit 940b214539
9 changed files with 204 additions and 163 deletions

View file

@ -71,7 +71,7 @@ public:
void Tick() {}
void SetTrialTextStringTable(CXuiStringTable*, int, int) {}
void SetTrialAwardText(eAwardType, int, int) {}
void SetTrialAwardText(EAwardType, int, int) {}
void StartTrialGame() {}
unsigned int RequestSignInUI(bool, bool, bool, bool, bool,
int (*)(void*, const bool, const int),
@ -100,11 +100,11 @@ public:
void WriteToProfile(int, bool = false, bool = false) {}
void ForceQueuedProfileWrites(int = XUSER_INDEX_ANY) {}
void ResetProfileProcessState() {}
void RegisterAward(int, int, eAwardType, bool = false,
void RegisterAward(int, int, EAwardType, bool = false,
CXuiStringTable* = nullptr, int = -1, int = -1,
int = -1, char* = nullptr, unsigned int = 0L) {}
int GetAwardId(int) { return 0; }
eAwardType GetAwardType(int) { return eAwardType_Achievement; }
EAwardType GetAwardType(int) { return eAwardType_Achievement; }
bool CanBeAwarded(int, int) { return false; }
void Award(int, int, bool = false) {}
bool IsAwardsFlagSet(int, int) { return false; }
@ -113,7 +113,7 @@ public:
void SetRichPresenceContextValue(int, int, int) {}
void SetCurrentGameActivity(int, int, bool = false) {}
void DisplayFullVersionPurchase(bool, int, int = -1) {}
void SetUpsellCallback(void (*)(void*, eUpsellType, eUpsellResponse, int),
void SetUpsellCallback(void (*)(void*, EUpsellType, EUpsellResponse, int),
void*) {}
void SetDebugFullOverride(bool) {}

View file

@ -4128,8 +4128,8 @@ void CMinecraftApp::NotificationsCallback(void* pParam,
pClass->m_vNotifications.push_back(pNotification);
}
void CMinecraftApp::UpsellReturnedCallback(void* pParam, eUpsellType type,
eUpsellResponse result,
void CMinecraftApp::UpsellReturnedCallback(void* pParam, EUpsellType type,
EUpsellResponse result,
int iUserData) {
// 4jcraft: nuked
}

View file

@ -363,8 +363,8 @@ public:
bool GetLiveLinkRequired() { return m_bLiveLinkRequired; }
void SetLiveLinkRequired(bool required) { m_bLiveLinkRequired = required; }
static void UpsellReturnedCallback(void* pParam, eUpsellType type,
eUpsellResponse result, int iUserData);
static void UpsellReturnedCallback(void* pParam, EUpsellType type,
EUpsellResponse result, int iUserData);
#if defined(_DEBUG_MENUS_ENABLED)
bool DebugSettingsOn() { return m_bDebugOptions; }

View file

@ -370,7 +370,7 @@ void C_4JProfile::Initialise(std::uint32_t dwTitleID, std::uint32_t dwOfferID,
}
void C_4JProfile::SetTrialTextStringTable(CXuiStringTable* pStringTable,
int iAccept, int iReject) {}
void C_4JProfile::SetTrialAwardText(eAwardType AwardType, int iTitle,
void C_4JProfile::SetTrialAwardText(EAwardType AwardType, int iTitle,
int iText) {}
int C_4JProfile::GetLockedProfile() { return 0; }
void C_4JProfile::SetLockedProfile(int iProf) {}
@ -476,12 +476,12 @@ void* C_4JProfile::GetGameDefinedProfileData(int iQuadrant) {
void C_4JProfile::ResetProfileProcessState() {}
void C_4JProfile::Tick(void) {}
void C_4JProfile::RegisterAward(int iAwardNumber, int iGamerconfigID,
eAwardType eType, bool bLeaderboardAffected,
EAwardType eType, bool bLeaderboardAffected,
CXuiStringTable* pStringTable, int iTitleStr,
int iTextStr, int iAcceptStr,
char* pszThemeName, unsigned int ulThemeSize) {}
int C_4JProfile::GetAwardId(int iAwardNumber) { return 0; }
eAwardType C_4JProfile::GetAwardType(int iAwardNumber) {
EAwardType C_4JProfile::GetAwardType(int iAwardNumber) {
return eAwardType_Achievement;
}
bool C_4JProfile::CanBeAwarded(int iQuadrant, int iAwardNumber) {
@ -498,8 +498,8 @@ void C_4JProfile::SetCurrentGameActivity(int iPad, int iNewPresence,
void C_4JProfile::DisplayFullVersionPurchase(bool bRequired, int iQuadrant,
int iUpsellParam) {}
void C_4JProfile::SetUpsellCallback(void (*Func)(void* lpParam,
eUpsellType type,
eUpsellResponse response,
EUpsellType type,
EUpsellResponse response,
int iUserData),
void* lpParam) {}
void C_4JProfile::SetDebugFullOverride(bool bVal) {

View file

@ -1,18 +1,6 @@
#pragma once
#include <cstdint>
enum EKeyboardResult {
EKeyboard_Pending,
EKeyboard_Cancelled,
EKeyboard_ResultAccept,
EKeyboard_ResultDecline,
};
typedef struct _STRING_VERIFY_RESPONSE {
std::uint16_t wNumStrings;
int* pStringResult;
} STRING_VERIFY_RESPONSE;
#include "PlatformTypes.h"
class IPlatformInput {
public:
@ -39,18 +27,21 @@ public:
// Joypad mapping
virtual void SetGameJoypadMaps(unsigned char ucMap, unsigned char ucAction,
unsigned int uiActionVal) = 0;
virtual unsigned int GetGameJoypadMaps(unsigned char ucMap,
unsigned char ucAction) = 0;
[[nodiscard]] virtual unsigned int GetGameJoypadMaps(
unsigned char ucMap, unsigned char ucAction) = 0;
virtual void SetJoypadMapVal(int iPad, unsigned char ucMap) = 0;
virtual unsigned char GetJoypadMapVal(int iPad) = 0;
[[nodiscard]] virtual unsigned char GetJoypadMapVal(int iPad) = 0;
virtual void SetJoypadSensitivity(int iPad, float fSensitivity) = 0;
// Input queries
virtual unsigned int GetValue(int iPad, unsigned char ucAction,
bool bRepeat = false) = 0;
virtual bool ButtonPressed(int iPad, unsigned char ucAction = 255) = 0;
virtual bool ButtonReleased(int iPad, unsigned char ucAction) = 0;
virtual bool ButtonDown(int iPad, unsigned char ucAction = 255) = 0;
[[nodiscard]] virtual unsigned int GetValue(int iPad, unsigned char ucAction,
bool bRepeat = false) = 0;
[[nodiscard]] virtual bool ButtonPressed(int iPad,
unsigned char ucAction = 255) = 0;
[[nodiscard]] virtual bool ButtonReleased(int iPad,
unsigned char ucAction) = 0;
[[nodiscard]] virtual bool ButtonDown(int iPad,
unsigned char ucAction = 255) = 0;
// Axis remapping
virtual void SetJoypadStickAxisMap(int iPad, unsigned int uiFrom,
@ -61,28 +52,28 @@ public:
float fRepeatRateSecs) = 0;
virtual void SetDebugSequence(const char* chSequenceA, int (*Func)(void*),
void* lpParam) = 0;
virtual float GetIdleSeconds(int iPad) = 0;
virtual bool IsPadConnected(int iPad) = 0;
[[nodiscard]] virtual float GetIdleSeconds(int iPad) = 0;
[[nodiscard]] virtual bool IsPadConnected(int iPad) = 0;
// Analog sticks and triggers (remapped for Southpaw etc.)
virtual float GetJoypadStick_LX(int iPad,
bool bCheckMenuDisplay = true) = 0;
virtual float GetJoypadStick_LY(int iPad,
bool bCheckMenuDisplay = true) = 0;
virtual float GetJoypadStick_RX(int iPad,
bool bCheckMenuDisplay = true) = 0;
virtual float GetJoypadStick_RY(int iPad,
bool bCheckMenuDisplay = true) = 0;
virtual unsigned char GetJoypadLTrigger(int iPad,
bool bCheckMenuDisplay = true) = 0;
virtual unsigned char GetJoypadRTrigger(int iPad,
bool bCheckMenuDisplay = true) = 0;
[[nodiscard]] virtual float GetJoypadStick_LX(
int iPad, bool bCheckMenuDisplay = true) = 0;
[[nodiscard]] virtual float GetJoypadStick_LY(
int iPad, bool bCheckMenuDisplay = true) = 0;
[[nodiscard]] virtual float GetJoypadStick_RX(
int iPad, bool bCheckMenuDisplay = true) = 0;
[[nodiscard]] virtual float GetJoypadStick_RY(
int iPad, bool bCheckMenuDisplay = true) = 0;
[[nodiscard]] virtual unsigned char GetJoypadLTrigger(
int iPad, bool bCheckMenuDisplay = true) = 0;
[[nodiscard]] virtual unsigned char GetJoypadRTrigger(
int iPad, bool bCheckMenuDisplay = true) = 0;
// Menu and misc
virtual void SetMenuDisplayed(int iPad, bool bVal) = 0;
virtual bool GetMenuDisplayed(int iPad) = 0;
virtual int GetHotbarSlotPressed(int iPad) = 0;
virtual int GetScrollDelta() = 0;
[[nodiscard]] virtual bool GetMenuDisplayed(int iPad) = 0;
[[nodiscard]] virtual int GetHotbarSlotPressed(int iPad) = 0;
[[nodiscard]] virtual int GetScrollDelta() = 0;
// Keyboard
virtual EKeyboardResult RequestKeyboard(const wchar_t* Title,
@ -91,7 +82,7 @@ public:
int (*Func)(void*, const bool),
void* lpParam,
EKeyboardMode eMode) = 0;
virtual const char* GetText() = 0;
[[nodiscard]] virtual const char* GetText() = 0;
// String verification (TCR 92)
virtual bool VerifyStrings(wchar_t** pwStringA, int iStringC,
@ -102,10 +93,10 @@ public:
virtual void CancelAllVerifyInProgress() = 0;
// Mouse
virtual int GetMouseX() = 0;
virtual int GetMouseY() = 0;
[[nodiscard]] virtual int GetMouseX() = 0;
[[nodiscard]] virtual int GetMouseY() = 0;
// Primary pad (which controller is player 1)
virtual int GetPrimaryPad() = 0;
[[nodiscard]] virtual int GetPrimaryPad() = 0;
virtual void SetPrimaryPad(int iPad) = 0;
};

View file

@ -4,30 +4,10 @@
#include <string>
#include "../4J.Common/4J_Compat.h"
#include "PlatformTypes.h"
class CXuiStringTable;
enum eAwardType {
eAwardType_Achievement = 0,
eAwardType_GamerPic,
eAwardType_Theme,
eAwardType_AvatarItem,
};
enum eUpsellType {
eUpsellType_Custom = 0,
eUpsellType_Achievement,
eUpsellType_GamerPic,
eUpsellType_Theme,
eUpsellType_AvatarItem,
};
enum eUpsellResponse {
eUpsellResponse_Declined,
eUpsellResponse_Accepted_NoPurchase,
eUpsellResponse_Accepted_Purchase,
};
class IPlatformProfile {
public:
struct PROFILESETTINGS {
@ -50,11 +30,11 @@ public:
virtual void Tick() = 0;
// Sign-in
virtual int GetLockedProfile() = 0;
[[nodiscard]] virtual int GetLockedProfile() = 0;
virtual void SetLockedProfile(int iProf) = 0;
virtual bool IsSignedIn(int iQuadrant) = 0;
virtual bool IsSignedInLive(int iProf) = 0;
virtual bool IsGuest(int iQuadrant) = 0;
[[nodiscard]] virtual bool IsSignedIn(int iQuadrant) = 0;
[[nodiscard]] virtual bool IsSignedInLive(int iProf) = 0;
[[nodiscard]] virtual bool IsGuest(int iQuadrant) = 0;
virtual unsigned int RequestSignInUI(
bool bFromInvite, bool bLocalGame, bool bNoGuestsAllowed,
bool bMultiplayerSignIn, bool bAddUser,
@ -67,28 +47,29 @@ public:
int (*Func)(void*, const bool, const int iPad), void* lpParam,
int iQuadrant = XUSER_INDEX_ANY) = 0;
virtual void SetPrimaryPlayerChanged(bool bVal) = 0;
virtual bool QuerySigninStatus() = 0;
[[nodiscard]] virtual bool QuerySigninStatus() = 0;
virtual void GetXUID(int iPad, PlayerUID* pXuid, bool bOnlineXuid) = 0;
virtual bool AreXUIDSEqual(PlayerUID xuid1, PlayerUID xuid2) = 0;
virtual bool XUIDIsGuest(PlayerUID xuid) = 0;
virtual bool AllowedToPlayMultiplayer(int iProf) = 0;
virtual bool GetChatAndContentRestrictions(int iPad, bool* pbChatRestricted,
bool* pbContentRestricted,
int* piAge) = 0;
[[nodiscard]] virtual bool AreXUIDSEqual(PlayerUID xuid1,
PlayerUID xuid2) = 0;
[[nodiscard]] virtual bool XUIDIsGuest(PlayerUID xuid) = 0;
[[nodiscard]] virtual bool AllowedToPlayMultiplayer(int iProf) = 0;
[[nodiscard]] virtual bool GetChatAndContentRestrictions(
int iPad, bool* pbChatRestricted, bool* pbContentRestricted,
int* piAge) = 0;
// System
virtual int GetPrimaryPad() = 0;
[[nodiscard]] virtual int GetPrimaryPad() = 0;
virtual void SetPrimaryPad(int iPad) = 0;
virtual char* GetGamertag(int iPad) = 0;
virtual std::wstring GetDisplayName(int iPad) = 0;
[[nodiscard]] virtual char* GetGamertag(int iPad) = 0;
[[nodiscard]] virtual std::wstring GetDisplayName(int iPad) = 0;
virtual void SetSignInChangeCallback(
void (*Func)(void*, bool, unsigned int), void* lpParam) = 0;
virtual void SetNotificationsCallback(
void (*Func)(void*, std::uint32_t, unsigned int), void* lpParam) = 0;
virtual bool RegionIsNorthAmerica() = 0;
virtual bool LocaleIsUSorCanada() = 0;
virtual int GetLiveConnectionStatus() = 0;
virtual bool IsSystemUIDisplayed() = 0;
[[nodiscard]] virtual bool RegionIsNorthAmerica() = 0;
[[nodiscard]] virtual bool LocaleIsUSorCanada() = 0;
[[nodiscard]] virtual int GetLiveConnectionStatus() = 0;
[[nodiscard]] virtual bool IsSystemUIDisplayed() = 0;
virtual void SetProfileReadErrorCallback(void (*Func)(void*),
void* lpParam) = 0;
@ -99,30 +80,31 @@ public:
virtual int SetOldProfileVersionCallback(
int (*Func)(void*, unsigned char*, const unsigned short, const int),
void* lpParam) = 0;
virtual PROFILESETTINGS* GetDashboardProfileSettings(int iPad) = 0;
[[nodiscard]] virtual PROFILESETTINGS* GetDashboardProfileSettings(
int iPad) = 0;
virtual void WriteToProfile(int iQuadrant,
bool bGameDefinedDataChanged = false,
bool bOverrideTimeLimit = false) = 0;
virtual void ForceQueuedProfileWrites(int iPad = XUSER_INDEX_ANY) = 0;
virtual void* GetGameDefinedProfileData(int iQuadrant) = 0;
[[nodiscard]] virtual void* GetGameDefinedProfileData(int iQuadrant) = 0;
virtual void ResetProfileProcessState() = 0;
// Trial
virtual void StartTrialGame() = 0;
virtual void SetTrialTextStringTable(CXuiStringTable* pStringTable,
int iAccept, int iReject) = 0;
virtual void SetTrialAwardText(eAwardType AwardType, int iTitle,
virtual void SetTrialAwardText(EAwardType AwardType, int iTitle,
int iText) = 0;
// Content
virtual void AllowedPlayerCreatedContent(int iPad, bool thisQuadrantOnly,
bool* allAllowed,
bool* friendsAllowed) = 0;
virtual bool CanViewPlayerCreatedContent(int iPad, bool thisQuadrantOnly,
PlayerUID* pXuids,
unsigned int xuidCount) = 0;
[[nodiscard]] virtual bool CanViewPlayerCreatedContent(
int iPad, bool thisQuadrantOnly, PlayerUID* pXuids,
unsigned int xuidCount) = 0;
virtual void ShowProfileCard(int iPad, PlayerUID targetUid) = 0;
virtual bool GetProfileAvatar(
[[nodiscard]] virtual bool GetProfileAvatar(
int iPad,
int (*Func)(void* lpParam, std::uint8_t* thumbnailData,
unsigned int thumbnailBytes),
@ -131,19 +113,19 @@ public:
// Achievements
virtual void RegisterAward(int iAwardNumber, int iGamerconfigID,
eAwardType eType,
bool bLeaderboardAffected = false,
EAwardType eType, bool bLeaderboardAffected = false,
CXuiStringTable* pStringTable = nullptr,
int iTitleStr = -1, int iTextStr = -1,
int iAcceptStr = -1,
char* pszThemeName = nullptr,
unsigned int uiThemeSize = 0L) = 0;
virtual int GetAwardId(int iAwardNumber) = 0;
virtual eAwardType GetAwardType(int iAwardNumber) = 0;
virtual bool CanBeAwarded(int iQuadrant, int iAwardNumber) = 0;
[[nodiscard]] virtual int GetAwardId(int iAwardNumber) = 0;
[[nodiscard]] virtual EAwardType GetAwardType(int iAwardNumber) = 0;
[[nodiscard]] virtual bool CanBeAwarded(int iQuadrant,
int iAwardNumber) = 0;
virtual void Award(int iQuadrant, int iAwardNumber,
bool bForce = false) = 0;
virtual bool IsAwardsFlagSet(int iQuadrant, int iAward) = 0;
[[nodiscard]] virtual bool IsAwardsFlagSet(int iQuadrant, int iAward) = 0;
// Rich presence
virtual void RichPresenceInit(int iPresenceCount, int iContextCount) = 0;
@ -156,10 +138,10 @@ public:
// Purchase
virtual void DisplayFullVersionPurchase(bool bRequired, int iQuadrant,
int iUpsellParam = -1) = 0;
virtual void SetUpsellCallback(void (*Func)(void* lpParam, eUpsellType type,
eUpsellResponse response,
int iUserData),
void* lpParam) = 0;
virtual void SetUpsellCallback(
void (*Func)(void* lpParam, EUpsellType type, EUpsellResponse response,
int iUserData),
void* lpParam) = 0;
// Debug
virtual void SetDebugFullOverride(bool bVal) = 0;

View file

@ -1,36 +1,8 @@
#pragma once
#include <cstdint>
#include <cstdlib>
class ImageFileBuffer {
public:
enum EImageType { e_typePNG, e_typeJPG };
EImageType m_type;
void* m_pBuffer;
int m_bufferSize;
int GetType() { return m_type; }
void* GetBufferPointer() { return m_pBuffer; }
int GetBufferSize() { return m_bufferSize; }
void Release() {
std::free(m_pBuffer);
m_pBuffer = nullptr;
}
bool Allocated() { return m_pBuffer != nullptr; }
};
struct D3DXIMAGE_INFO {
int Width;
int Height;
};
struct XSOCIAL_PREVIEWIMAGE {
std::uint8_t* pBytes;
std::uint32_t Pitch;
std::uint32_t Width;
std::uint32_t Height;
};
using PXSOCIAL_PREVIEWIMAGE = XSOCIAL_PREVIEWIMAGE*;
#include "PlatformTypes.h"
class IPlatformRender {
public:
@ -88,16 +60,16 @@ public:
virtual void SetClearColour(const float colourRGBA[4]) = 0;
virtual void Shutdown() = 0;
virtual void Suspend() = 0;
virtual bool Suspended() = 0;
[[nodiscard]] virtual bool Suspended() = 0;
virtual void Resume() = 0;
// Window
virtual void SetWindowSize(int w, int h) = 0;
virtual void SetFullscreen(bool fs) = 0;
virtual bool IsWidescreen() = 0;
virtual bool IsHiDef() = 0;
[[nodiscard]] virtual bool IsWidescreen() = 0;
[[nodiscard]] virtual bool IsHiDef() = 0;
virtual void GetFramebufferSize(int& width, int& height) = 0;
virtual bool ShouldClose() = 0;
[[nodiscard]] virtual bool ShouldClose() = 0;
virtual void Close() = 0;
virtual void UpdateGamma(unsigned short usGamma) = 0;
@ -114,7 +86,7 @@ public:
virtual void MatrixPop() = 0;
virtual void MatrixPush() = 0;
virtual void MatrixMult(float* mat) = 0;
virtual const float* MatrixGet(int type) = 0;
[[nodiscard]] virtual const float* MatrixGet(int type) = 0;
virtual void Set_matrixDirty() = 0;
// Draw calls
@ -124,24 +96,24 @@ public:
// Command buffers
virtual void CBuffLockStaticCreations() = 0;
virtual int CBuffCreate(int count) = 0;
[[nodiscard]] virtual int CBuffCreate(int count) = 0;
virtual void CBuffDelete(int first, int count) = 0;
virtual void CBuffStart(int index, bool full = false) = 0;
virtual void CBuffClear(int index) = 0;
virtual int CBuffSize(int index) = 0;
[[nodiscard]] virtual int CBuffSize(int index) = 0;
virtual void CBuffEnd() = 0;
virtual bool CBuffCall(int index, bool full = true) = 0;
[[nodiscard]] virtual bool CBuffCall(int index, bool full = true) = 0;
virtual void CBuffTick() = 0;
virtual void CBuffDeferredModeStart() = 0;
virtual void CBuffDeferredModeEnd() = 0;
// Textures
virtual int TextureCreate() = 0;
[[nodiscard]] virtual int TextureCreate() = 0;
virtual void TextureFree(int idx) = 0;
virtual void TextureBind(int idx) = 0;
virtual void TextureBindVertex(int idx, bool scaleLight = false) = 0;
virtual void TextureSetTextureLevels(int levels) = 0;
virtual int TextureGetTextureLevels() = 0;
[[nodiscard]] virtual int TextureGetTextureLevels() = 0;
virtual void TextureData(int width, int height, void* data, int level,
eTextureFormat format = TEXTURE_FORMAT_RxGyBzAw) = 0;
virtual void TextureDataUpdate(int xoffset, int yoffset, int width,
@ -149,21 +121,24 @@ public:
virtual void TextureSetParam(int param, int value) = 0;
virtual void TextureDynamicUpdateStart() = 0;
virtual void TextureDynamicUpdateEnd() = 0;
virtual int LoadTextureData(const char* szFilename,
D3DXIMAGE_INFO* pSrcInfo,
int** ppDataOut) = 0;
virtual int LoadTextureData(std::uint8_t* pbData, std::uint32_t byteCount,
D3DXIMAGE_INFO* pSrcInfo,
int** ppDataOut) = 0;
virtual int SaveTextureData(const char* szFilename,
D3DXIMAGE_INFO* pSrcInfo,
int* ppDataOut) = 0;
virtual int SaveTextureDataToMemory(void* pOutput, int outputCapacity,
int* outputLength, int width,
int height, int* ppDataIn) = 0;
[[nodiscard]] virtual int LoadTextureData(const char* szFilename,
D3DXIMAGE_INFO* pSrcInfo,
int** ppDataOut) = 0;
[[nodiscard]] virtual int LoadTextureData(std::uint8_t* pbData,
std::uint32_t byteCount,
D3DXIMAGE_INFO* pSrcInfo,
int** ppDataOut) = 0;
[[nodiscard]] virtual int SaveTextureData(const char* szFilename,
D3DXIMAGE_INFO* pSrcInfo,
int* ppDataOut) = 0;
[[nodiscard]] virtual int SaveTextureDataToMemory(void* pOutput,
int outputCapacity,
int* outputLength,
int width, int height,
int* ppDataIn) = 0;
virtual void ReadPixels(int x, int y, int w, int h, void* buf) = 0;
virtual void TextureGetStats() = 0;
virtual void* TextureGetTexture(int idx) = 0;
[[nodiscard]] virtual void* TextureGetTexture(int idx) = 0;
// Render state
virtual void StateSetColour(float r, float g, float b, float a) = 0;

View file

@ -1,5 +1,6 @@
#pragma once
#include "PlatformTypes.h"
#include "IPlatformInput.h"
#include "IPlatformNetwork.h"
#include "IPlatformProfile.h"

View file

@ -0,0 +1,92 @@
#pragma once
#include <cstdint>
#include <cstdlib>
// Shared value types used by platform interfaces. These are NOT interfaces
// themselves — they are data carriers that cross the platform boundary.
struct ImageFileBuffer {
enum EImageType { e_typePNG, e_typeJPG };
EImageType m_type;
void* m_pBuffer = nullptr;
int m_bufferSize = 0;
[[nodiscard]] int GetType() const { return m_type; }
[[nodiscard]] void* GetBufferPointer() const { return m_pBuffer; }
[[nodiscard]] int GetBufferSize() const { return m_bufferSize; }
[[nodiscard]] bool Allocated() const { return m_pBuffer != nullptr; }
void Release() {
std::free(m_pBuffer);
m_pBuffer = nullptr;
}
};
struct D3DXIMAGE_INFO {
int Width;
int Height;
};
struct XSOCIAL_PREVIEWIMAGE {
std::uint8_t* pBytes;
std::uint32_t Pitch;
std::uint32_t Width;
std::uint32_t Height;
};
using PXSOCIAL_PREVIEWIMAGE = XSOCIAL_PREVIEWIMAGE*;
struct STRING_VERIFY_RESPONSE {
std::uint16_t wNumStrings;
int* pStringResult;
};
enum class EKeyboardResult {
Pending,
Cancelled,
ResultAccept,
ResultDecline,
};
// Profile-related enums at file scope.
enum class EAwardType {
Achievement = 0,
GamerPic,
Theme,
AvatarItem,
};
enum class EUpsellType {
Custom = 0,
Achievement,
GamerPic,
Theme,
AvatarItem,
};
enum class EUpsellResponse {
Declined,
Accepted_NoPurchase,
Accepted_Purchase,
};
// Backwards-compatible aliases for call sites still using the old
// unscoped names. Remove these as call sites are migrated.
inline constexpr auto EKeyboard_Pending = EKeyboardResult::Pending;
inline constexpr auto EKeyboard_Cancelled = EKeyboardResult::Cancelled;
inline constexpr auto EKeyboard_ResultAccept = EKeyboardResult::ResultAccept;
inline constexpr auto EKeyboard_ResultDecline = EKeyboardResult::ResultDecline;
inline constexpr auto eAwardType_Achievement = EAwardType::Achievement;
inline constexpr auto eAwardType_GamerPic = EAwardType::GamerPic;
inline constexpr auto eAwardType_Theme = EAwardType::Theme;
inline constexpr auto eAwardType_AvatarItem = EAwardType::AvatarItem;
inline constexpr auto eUpsellType_Custom = EUpsellType::Custom;
inline constexpr auto eUpsellType_Achievement = EUpsellType::Achievement;
inline constexpr auto eUpsellType_GamerPic = EUpsellType::GamerPic;
inline constexpr auto eUpsellType_Theme = EUpsellType::Theme;
inline constexpr auto eUpsellType_AvatarItem = EUpsellType::AvatarItem;
inline constexpr auto eUpsellResponse_Declined = EUpsellResponse::Declined;
inline constexpr auto eUpsellResponse_Accepted_NoPurchase = EUpsellResponse::Accepted_NoPurchase;
inline constexpr auto eUpsellResponse_Accepted_Purchase = EUpsellResponse::Accepted_Purchase;