BVB Source Codes

CRYENGINE Show PlayerProfileManager.h Source code

Return Download CRYENGINE: download PlayerProfileManager.h Source code - Download CRYENGINE Source code - Type:.h
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. #ifndef __PLAYERPROFILEMANAGER_H__
  4. #define __PLAYERPROFILEMANAGER_H__
  5.  
  6. #if _MSC_VER > 1000
  7.         #pragma once
  8. #endif
  9.  
  10. #include <IPlayerProfiles.h>
  11. #include <CryCore/CryCrc32.h>
  12.  
  13. class CPlayerProfile;
  14. struct ISaveGame;
  15. struct ILoadGame;
  16.  
  17. #if defined(_DEBUG)
  18.         #define PROFILE_DEBUG_COMMANDS 1
  19. #else
  20.         #define PROFILE_DEBUG_COMMANDS 0
  21. #endif
  22.  
  23. class CPlayerProfileManager : public IPlayerProfileManager
  24. {
  25. public:
  26.         struct IPlatformImpl;
  27.  
  28.         // profile description
  29.         struct SLocalProfileInfo
  30.         {
  31.                 SLocalProfileInfo()
  32.                         : m_lastLoginTime(0)
  33.                 {
  34.                         SetName(PLAYER_DEFAULT_PROFILE_NAME);
  35.                 }
  36.                 SLocalProfileInfo(const string& name)
  37.                         : m_lastLoginTime(0)
  38.                 {
  39.                         SetName(name);
  40.                 }
  41.                 SLocalProfileInfo(const char* name)
  42.                         : m_lastLoginTime(0)
  43.                 {
  44.                         SetName(name);
  45.                 }
  46.  
  47.                 void SetName(const char* name)
  48.                 {
  49.                         m_name = name;
  50.                 }
  51.  
  52.                 void SetName(const string& name)
  53.                 {
  54.                         m_name = name;
  55.                 }
  56.                 void SetLastLoginTime(time_t lastLoginTime)
  57.                 {
  58.                         m_lastLoginTime = lastLoginTime;
  59.                 }
  60.  
  61.                 const string& GetName() const
  62.                 {
  63.                         return m_name;
  64.                 }
  65.  
  66.                 const time_t& GetLastLoginTime() const
  67.                 {
  68.                         return m_lastLoginTime;
  69.                 }
  70.  
  71.                 int compare(const char* name) const
  72.                 {
  73.                         return m_name.compareNoCase(name);
  74.                 }
  75.  
  76.         private:
  77.                 string m_name; // name of the profile
  78.                 time_t m_lastLoginTime;
  79.         };
  80.  
  81.         // per user data
  82.         struct SUserEntry
  83.         {
  84.                 SUserEntry(const string& inUserId) : userId(inUserId), pCurrentProfile(0), pCurrentPreviewProfile(0), userIndex(0), unknownUser(false) {}
  85.                 string                         userId;
  86.                 CPlayerProfile*                pCurrentProfile;
  87.                 CPlayerProfile*                pCurrentPreviewProfile;
  88.                 unsigned int                   userIndex;
  89.                 bool                           unknownUser;
  90.                 std::vector<SLocalProfileInfo> profileDesc;
  91.         };
  92.         typedef std::vector<SUserEntry*> TUserVec;
  93.  
  94.         struct SSaveGameMetaData
  95.         {
  96.                 SSaveGameMetaData()
  97.                 {
  98.                         levelName = gameRules = buildVersion = SAVEGAME_LEVEL_NAME_UNDEFINED;
  99.                         saveTime = 0;
  100.                         loadTime = 0;
  101.                         fileVersion = -1;
  102.                 }
  103.                 void CopyTo(ISaveGameEnumerator::SGameMetaData& data)
  104.                 {
  105.                         data.levelName = levelName;
  106.                         data.gameRules = gameRules;
  107.                         data.fileVersion = fileVersion;
  108.                         data.buildVersion = buildVersion;
  109.                         data.saveTime = saveTime;
  110.                         data.loadTime = loadTime;
  111.                         data.xmlMetaDataNode = xmlMetaDataNode;
  112.                 }
  113.                 string     levelName;
  114.                 string     gameRules;
  115.                 int        fileVersion;
  116.                 string     buildVersion;
  117.                 time_t     saveTime; // original time of save
  118.                 time_t     loadTime; // most recent time loaded, from file modified timestamp
  119.                 XmlNodeRef xmlMetaDataNode;
  120.         };
  121.  
  122.         struct SThumbnail
  123.         {
  124.                 SThumbnail() : width(0), height(0), depth(0) {}
  125.                 DynArray<uint8> data;
  126.                 int             width;
  127.                 int             height;
  128.                 int             depth;
  129.                 bool IsValid() const { return data.size() && width && height && depth; }
  130.                 void ReleaseData()
  131.                 {
  132.                         data.clear();
  133.                         width = height = depth = 0;
  134.                 }
  135.         };
  136.  
  137.         struct SSaveGameInfo
  138.         {
  139.                 string            name;
  140.                 string            humanName;
  141.                 string            description;
  142.                 SSaveGameMetaData metaData;
  143.                 SThumbnail        thumbnail;
  144.                 void              CopyTo(ISaveGameEnumerator::SGameDescription& desc)
  145.                 {
  146.                         desc.name = name;
  147.                         desc.humanName = humanName;
  148.                         desc.description = description;
  149.                         metaData.CopyTo(desc.metaData);
  150.                 }
  151.         };
  152.         typedef std::vector<SSaveGameInfo> TSaveGameInfoVec;
  153.  
  154.         enum EPlayerProfileSection
  155.         {
  156.                 ePPS_Attribute = 0,
  157.                 ePPS_Actionmap,
  158.                 ePPS_Num  // Last
  159.         };
  160.  
  161.         // members
  162.  
  163.         CPlayerProfileManager(CPlayerProfileManager::IPlatformImpl* pImpl); // CPlayerProfileManager takes ownership of IPlatformImpl*
  164.         virtual ~CPlayerProfileManager();
  165.  
  166.         // IPlayerProfileManager
  167.         virtual bool                  Initialize();
  168.         virtual bool                  Shutdown();
  169.         virtual int                   GetUserCount();
  170.         virtual bool                  GetUserInfo(int index, IPlayerProfileManager::SUserInfo& outInfo);
  171.         virtual const char*           GetCurrentUser();
  172.         virtual int                   GetCurrentUserIndex();
  173.         virtual void                  SetExclusiveControllerDeviceIndex(unsigned int exclusiveDeviceIndex);
  174.         virtual unsigned int          GetExclusiveControllerDeviceIndex() const;
  175.         virtual bool                  LoginUser(const char* userId, bool& bOutFirstTime);
  176.         virtual bool                  LogoutUser(const char* userId);
  177.         virtual int                   GetProfileCount(const char* userId);
  178.         virtual bool                  GetProfileInfo(const char* userId, int index, IPlayerProfileManager::SProfileDescription& outInfo);
  179.         virtual bool                  CreateProfile(const char* userId, const char* profileName, bool bOverrideIfPresent, IPlayerProfileManager::EProfileOperationResult& result);
  180.         virtual bool                  DeleteProfile(const char* userId, const char* profileName, IPlayerProfileManager::EProfileOperationResult& result);
  181.         virtual bool                  RenameProfile(const char* userId, const char* newName, IPlayerProfileManager::EProfileOperationResult& result);
  182.         virtual bool                  SaveProfile(const char* userId, IPlayerProfileManager::EProfileOperationResult& result, unsigned int reason);
  183.         virtual bool                  SaveInactiveProfile(const char* userId, const char* profileName, EProfileOperationResult& result, unsigned int reason);
  184.         virtual bool                  IsLoadingProfile() const;
  185.         virtual bool                  IsSavingProfile() const;
  186.         virtual IPlayerProfile*       ActivateProfile(const char* userId, const char* profileName);
  187.         virtual IPlayerProfile*       GetCurrentProfile(const char* userId);
  188.         virtual bool                  ResetProfile(const char* userId);
  189.         virtual void                  ReloadProfile(IPlayerProfile* pProfile, unsigned int reason);
  190.         virtual IPlayerProfile*       GetDefaultProfile();
  191.         virtual const IPlayerProfile* PreviewProfile(const char* userId, const char* profileName);
  192.         virtual void                  SetSharedSaveGameFolder(const char* sharedSaveGameFolder);
  193.         virtual const char*           GetSharedSaveGameFolder()
  194.         {
  195.                 return m_sharedSaveGameFolder.c_str();
  196.         }
  197.         virtual void   GetMemoryStatistics(ICrySizer* s);
  198.  
  199.         virtual void   AddListener(IPlayerProfileListener* pListener, bool updateNow);
  200.         virtual void   RemoveListener(IPlayerProfileListener* pListener);
  201.         virtual void   AddOnlineAttributesListener(IOnlineAttributesListener* pListener);
  202.         virtual void   RemoveOnlineAttributesListener(IOnlineAttributesListener* pListener);
  203.         virtual void   EnableOnlineAttributes(bool enable);
  204.         virtual bool   HasEnabledOnlineAttributes() const;
  205.         virtual bool   CanProcessOnlineAttributes() const;
  206.         virtual void   SetCanProcessOnlineAttributes(bool enable);
  207.         virtual bool   RegisterOnlineAttributes();
  208.         virtual void   GetOnlineAttributesState(const IOnlineAttributesListener::EEvent event, IOnlineAttributesListener::EState& state) const;
  209.         virtual bool   IsOnlineOnlyAttribute(const char* name);
  210.         virtual void   LoadOnlineAttributes(IPlayerProfile* pProfile);
  211.         virtual void   SaveOnlineAttributes(IPlayerProfile* pProfile);
  212.         virtual int    GetOnlineAttributesVersion() const;
  213.         virtual int    GetOnlineAttributeIndexByName(const char* name);
  214.         virtual void   GetOnlineAttributesDataFormat(SCryLobbyUserData* pData, uint32 numData);
  215.         virtual uint32 GetOnlineAttributeCount();
  216.         virtual void   ClearOnlineAttributes();
  217.         virtual void   SetProfileLastLoginTime(const char* userId, int index, time_t lastLoginTime);
  218.         // ~IPlayerProfileManager
  219.  
  220.         void LoadGamerProfileDefaults(IPlayerProfile* pProfile);
  221.  
  222.         // maybe move to IPlayerProfileManager i/f
  223.         virtual ISaveGameEnumeratorPtr CreateSaveGameEnumerator(const char* userId, CPlayerProfile* pProfile);
  224.         virtual ISaveGame*             CreateSaveGame(const char* userId, CPlayerProfile* pProfile);
  225.         virtual ILoadGame*             CreateLoadGame(const char* userId, CPlayerProfile* pProfile);
  226.         virtual bool                   DeleteSaveGame(const char* userId, CPlayerProfile* pProfile, const char* name);
  227.  
  228.         virtual ILevelRotationFile*    GetLevelRotationFile(const char* userId, CPlayerProfile* pProfile, const char* name);
  229.  
  230.         virtual bool                   ResolveAttributeBlock(const char* userId, const char* attrBlockName, IResolveAttributeBlockListener* pListener, int reason);
  231.         virtual bool                   ResolveAttributeBlock(const char* userId, const SResolveAttributeRequest& attrBlockNameRequest, IResolveAttributeBlockListener* pListener, int reason);
  232.  
  233.         const string&                  GetSharedSaveGameFolder() const
  234.         {
  235.                 return m_sharedSaveGameFolder;
  236.         }
  237.  
  238.         bool IsSaveGameFolderShared() const
  239.         {
  240. #if CRY_PLATFORM_DESKTOP
  241.                 return m_sharedSaveGameFolder.empty() == false;
  242. #else
  243.                 // TCR/TRC - don't use profile name in file names.
  244.                 // Also, console saves are already keyed to a user profile.
  245.                 return false;
  246. #endif
  247.         }
  248.  
  249.         ILINE CPlayerProfile* GetDefaultCPlayerProfile() const
  250.         {
  251.                 return m_pDefaultProfile;
  252.         }
  253.  
  254.         // helper to move file or directory -> should eventually go into CrySystem/CryPak
  255.         // only implemented for Windows
  256.         bool           MoveFileHelper(const char* existingFileName, const char* newFileName);
  257.  
  258.         virtual void   SetOnlineAttributes(IPlayerProfile* pProfile, const SCryLobbyUserData* pData, const int32 onlineDataCount);
  259.         virtual uint32 GetOnlineAttributes(SCryLobbyUserData* pData, uint32 numData);
  260.         virtual uint32 GetDefaultOnlineAttributes(SCryLobbyUserData* pData, uint32 numData);
  261.  
  262.         void           ApplyChecksums(SCryLobbyUserData* pData, uint32 numData);
  263.         bool           ValidChecksums(const SCryLobbyUserData* pData, uint32 numData);
  264.  
  265. public:
  266.         struct IProfileXMLSerializer
  267.         {
  268.                 virtual ~IProfileXMLSerializer(){}
  269.                 virtual bool       IsLoading() = 0;
  270.  
  271.                 virtual void       SetSection(CPlayerProfileManager::EPlayerProfileSection section, XmlNodeRef& node) = 0;
  272.                 virtual XmlNodeRef CreateNewSection(CPlayerProfileManager::EPlayerProfileSection section, const char* name) = 0;
  273.                 virtual XmlNodeRef GetSection(CPlayerProfileManager::EPlayerProfileSection section) = 0;
  274.  
  275.                 /*
  276.                    virtual XmlNodeRef AddSection(const char* name) = 0;
  277.                    virtual XmlNodeRef GetSection(const char* name) = 0;
  278.                  */
  279.         };
  280.  
  281.         struct IPlatformImpl
  282.         {
  283.                 typedef CPlayerProfileManager::SUserEntry               SUserEntry;
  284.                 typedef CPlayerProfileManager::SLocalProfileInfo        SLocalProfileInfo;
  285.                 typedef CPlayerProfileManager::SThumbnail               SThumbnail;
  286.                 typedef CPlayerProfileManager::SResolveAttributeRequest SResolveAttributeRequest;
  287.                 virtual ~IPlatformImpl(){}
  288.                 virtual bool                Initialize(CPlayerProfileManager* pMgr) = 0;
  289.                 virtual void                Release() = 0; // must delete itself
  290.                 virtual bool                LoginUser(SUserEntry* pEntry) = 0;
  291.                 virtual bool                LogoutUser(SUserEntry* pEntry) = 0;
  292.                 virtual bool                SaveProfile(SUserEntry* pEntry, CPlayerProfile* pProfile, const char* name, bool initialSave = false, int reason = ePR_All) = 0;
  293.                 virtual bool                LoadProfile(SUserEntry* pEntry, CPlayerProfile* pProfile, const char* name) = 0;
  294.                 virtual bool                DeleteProfile(SUserEntry* pEntry, const char* name) = 0;
  295.                 virtual bool                RenameProfile(SUserEntry* pEntry, const char* newName) = 0;
  296.                 virtual bool                GetSaveGames(SUserEntry* pEntry, TSaveGameInfoVec& outVec, const char* altProfileName = "") = 0; // if altProfileName == "", uses current profile of SUserEntry
  297.                 virtual ISaveGame*          CreateSaveGame(SUserEntry* pEntry) = 0;
  298.                 virtual ILoadGame*          CreateLoadGame(SUserEntry* pEntry) = 0;
  299.                 virtual bool                DeleteSaveGame(SUserEntry* pEntry, const char* name) = 0;
  300.                 virtual ILevelRotationFile* GetLevelRotationFile(SUserEntry* pEntry, const char* name) = 0;
  301.                 virtual bool                GetSaveGameThumbnail(SUserEntry* pEntry, const char* saveGameName, SThumbnail& thumbnail) = 0;
  302.                 virtual void                GetMemoryStatistics(ICrySizer* s) = 0;
  303.                 virtual bool                ResolveAttributeBlock(SUserEntry* pEntry, CPlayerProfile* pProfile, const char* attrBlockName, IResolveAttributeBlockListener* pListener, int reason)                            { return false; }
  304.                 virtual bool                ResolveAttributeBlock(SUserEntry* pEntry, CPlayerProfile* pProfile, const SResolveAttributeRequest& attrBlockNameRequest, IResolveAttributeBlockListener* pListener, int reason) { return false; }
  305.  
  306.         };
  307.  
  308.         SUserEntry* FindEntry(const char* userId) const;
  309.  
  310. protected:
  311.  
  312.         SUserEntry*        FindEntry(const char* userId, TUserVec::iterator& outIter);
  313.  
  314.         SLocalProfileInfo* GetLocalProfileInfo(SUserEntry* pEntry, const char* profileName) const;
  315.         SLocalProfileInfo* GetLocalProfileInfo(SUserEntry* pEntry, const char* profileName, std::vector<SLocalProfileInfo>::iterator& outIter) const;
  316.  
  317. public:
  318.         static int         sUseRichSaveGames;
  319.         static int         sRSFDebugWrite;
  320.         static int         sRSFDebugWriteOnLoad;
  321.         static int         sLoadOnlineAttributes;
  322.  
  323.         static const char* FACTORY_DEFAULT_NAME;
  324.         static const char* PLAYER_DEFAULT_PROFILE_NAME;
  325.  
  326. protected:
  327.         bool        SetUserData(SCryLobbyUserData* data, const TFlowInputData& value);
  328.         bool        ReadUserData(const SCryLobbyUserData* data, TFlowInputData& val);
  329.         uint32      UserDataSize(const SCryLobbyUserData* data);
  330.         bool        SetUserDataType(SCryLobbyUserData* data, const char* type);
  331.         void        GetDefaultValue(const char* type, XmlNodeRef attributeNode, SCryLobbyUserData* pOutData);
  332.  
  333.         bool        RegisterOnlineAttribute(const char* name, const char* type, const bool onlineOnly, const SCryLobbyUserData& defaultValue, CCrc32& crc);
  334.         void        ReadOnlineAttributes(IPlayerProfile* pProfile, const SCryLobbyUserData* pData, const uint32 numData);
  335.         static void ReadUserDataCallback(CryLobbyTaskID taskID, ECryLobbyError error, SCryLobbyUserData* pData, uint32 numData, void* pArg);
  336.         static void RegisterUserDataCallback(CryLobbyTaskID taskID, ECryLobbyError error, void* pArg);
  337.         static void WriteUserDataCallback(CryLobbyTaskID taskID, ECryLobbyError error, void* pArg);
  338.  
  339.         void        SetOnlineAttributesState(const IOnlineAttributesListener::EEvent event, const IOnlineAttributesListener::EState newState);
  340.         void        SendOnlineAttributeState(const IOnlineAttributesListener::EEvent event, const IOnlineAttributesListener::EState newState);
  341.  
  342.         //Online attributes use checksums to check the validity of data loaded
  343.         int  Checksum(const int checksum, const SCryLobbyUserData* pData, uint32 numData);
  344.         int  ChecksumHash(const int hash, const int value) const;
  345.         int  ChecksumHash(const int value0, const int value1, const int value2, const int value3, const int value4) const;
  346.         int  ChecksumConvertValueToInt(const SCryLobbyUserData* pData);
  347.  
  348.         bool LoadProfile(SUserEntry* pEntry, CPlayerProfile* pProfile, const char* name, bool bPreview = false);
  349.  
  350.         const static int k_maxOnlineDataCount = 1500;
  351.         const static int k_maxOnlineDataBytes = 2976; //reduced from 3000 for encryption
  352.         const static int k_onlineChecksums = 2;
  353.  
  354. #if PROFILE_DEBUG_COMMANDS
  355.         static void DbgLoadOnlineAttributes(IConsoleCmdArgs* args);
  356.         static void DbgSaveOnlineAttributes(IConsoleCmdArgs* args);
  357.         static void DbgTestOnlineAttributes(IConsoleCmdArgs* args);
  358.  
  359.         static void DbgLoadProfile(IConsoleCmdArgs* args);
  360.         static void DbgSaveProfile(IConsoleCmdArgs* args);
  361.  
  362.         SCryLobbyUserData m_testData[k_maxOnlineDataCount];
  363.         int               m_testFlowData[k_maxOnlineDataCount];
  364.         int               m_testingPhase;
  365. #endif
  366.  
  367.         typedef VectorMap<string, uint32>            TOnlineAttributeMap;
  368.         typedef std::vector<IPlayerProfileListener*> TListeners;
  369.  
  370.         SCryLobbyUserData                 m_defaultOnlineData[k_maxOnlineDataCount];
  371.         SCryLobbyUserData                 m_onlineData[k_maxOnlineDataCount];
  372.         bool                              m_onlineOnlyData[k_maxOnlineDataCount];
  373.         TOnlineAttributeMap               m_onlineAttributeMap;
  374.         TListeners                        m_listeners;
  375.         TUserVec                          m_userVec;
  376.         string                            m_curUserID;
  377.         string                            m_sharedSaveGameFolder;
  378.         int                               m_curUserIndex;
  379.         unsigned int                      m_exclusiveControllerDeviceIndex;
  380.         uint32                            m_onlineDataCount;
  381.         uint32                            m_onlineDataByteCount;
  382.         uint32                            m_onlineAttributeAutoGeneratedVersion;
  383.         IPlatformImpl*                    m_pImpl;
  384.         CPlayerProfile*                   m_pDefaultProfile;
  385.         IPlayerProfile*                   m_pReadingProfile;
  386.         IOnlineAttributesListener::EState m_onlineAttributesState[IOnlineAttributesListener::eOAE_Max];
  387.         IOnlineAttributesListener*        m_onlineAttributesListener;
  388.         int                               m_onlineAttributeDefinedVersion;
  389.         CryLobbyTaskID                    m_lobbyTaskId;
  390.         bool                              m_registered;
  391.         bool                              m_bInitialized;
  392.         bool                              m_enableOnlineAttributes;
  393.         bool                              m_allowedToProcessOnlineAttributes;
  394.         bool                              m_loadingProfile;
  395.         bool                              m_savingProfile;
  396. };
  397.  
  398. #endif
  399.  
downloadPlayerProfileManager.h Source code - Download CRYENGINE Source code
Related Source Codes/Software:
postal - 2017-06-11
reactide - Reactide is the first dedicated IDE for React web ... 2017-06-11
rkt - rkt is a pod-native container engine for Linux. It... 2017-06-11
uWebSockets - Tiny WebSockets https://for... 2017-06-11
realworld - TodoMVC for the RealWorld - Exemplary fullstack Me... 2017-06-11
CRYENGINE - CRYENGINE is a powerful real-time game development... 2017-06-11
goreplay - GoReplay is an open-source tool for capturing and ... 2017-06-10
pyenv - Simple Python version management 2017-06-10
redux-saga - An alternative side effect model for Redux apps ... 2017-06-10
angular-starter - 2017-06-10

 Back to top