SaveData_SystemComponent_Android.cpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <SaveDataSystemComponent.h>
  9. #include <AzCore/Android/Utils.h>
  10. #include <AzCore/IO/SystemFile.h>
  11. #include <AzCore/std/string/conversions.h>
  12. ////////////////////////////////////////////////////////////////////////////////////////////////////
  13. namespace SaveData
  14. {
  15. ////////////////////////////////////////////////////////////////////////////////////////////////
  16. //! Platform specific implementation for the save data system component on Android
  17. class SaveDataSystemComponentAndroid : public SaveDataSystemComponent::Implementation
  18. {
  19. public:
  20. ////////////////////////////////////////////////////////////////////////////////////////////
  21. static constexpr const char* DefaultSaveDataDirectoryName = "SaveData";
  22. ////////////////////////////////////////////////////////////////////////////////////////////
  23. // Allocator
  24. AZ_CLASS_ALLOCATOR(SaveDataSystemComponentAndroid, AZ::SystemAllocator);
  25. ////////////////////////////////////////////////////////////////////////////////////////////
  26. //! Constructor
  27. //! \param[in] saveDataSystemComponent Reference to the parent being implemented
  28. SaveDataSystemComponentAndroid(SaveDataSystemComponent& saveDataSystemComponent);
  29. ////////////////////////////////////////////////////////////////////////////////////////////
  30. //! Destructor
  31. ~SaveDataSystemComponentAndroid() override;
  32. protected:
  33. ////////////////////////////////////////////////////////////////////////////////////////////
  34. //! \ref SaveData::SaveDataSystemComponent::Implementation::SaveDataBuffer
  35. void SaveDataBuffer(const SaveDataRequests::SaveDataBufferParams& saveDataBufferParams) override;
  36. ////////////////////////////////////////////////////////////////////////////////////////////
  37. //! \ref SaveData::SaveDataSystemComponent::Implementation::LoadDataBuffer
  38. void LoadDataBuffer(const SaveDataRequests::LoadDataBufferParams& loadDataBufferParams) override;
  39. ////////////////////////////////////////////////////////////////////////////////////////////
  40. //! \ref SaveData::SaveDataSystemComponent::Implementation::SetSaveDataDirectoryPath
  41. void SetSaveDataDirectoryPath(const char* saveDataDirectoryPath) override;
  42. private:
  43. ////////////////////////////////////////////////////////////////////////////////////////////
  44. //! Convenience function to construct the full save data file path.
  45. //! \param[in] dataBufferName The name of the save data buffer.
  46. //! \param[in] localUserId The local user id the save data buffer is associated with.
  47. AZStd::string GetSaveDataFilePath(const AZStd::string& dataBufferName,
  48. AzFramework::LocalUserId localUserId);
  49. ////////////////////////////////////////////////////////////////////////////////////////////
  50. //! The absolute path to the application's save data dircetory.
  51. AZStd::string m_saveDataDircetoryPathAbsolute;
  52. };
  53. ////////////////////////////////////////////////////////////////////////////////////////////////
  54. AZStd::string GetDefaultAndroidUserSaveDataPath()
  55. {
  56. return AZStd::string::format("%s/", AZ::Android::Utils::GetAppPublicStoragePath());
  57. }
  58. ////////////////////////////////////////////////////////////////////////////////////////////////
  59. bool IsAbsolutePath(const char* path)
  60. {
  61. return path && path[0] == '/';
  62. }
  63. ////////////////////////////////////////////////////////////////////////////////////////////////
  64. SaveDataSystemComponent::Implementation* SaveDataSystemComponent::Implementation::Create(SaveDataSystemComponent& saveDataSystemComponent)
  65. {
  66. return aznew SaveDataSystemComponentAndroid(saveDataSystemComponent);
  67. }
  68. ////////////////////////////////////////////////////////////////////////////////////////////////
  69. SaveDataSystemComponentAndroid::SaveDataSystemComponentAndroid(SaveDataSystemComponent& saveDataSystemComponent)
  70. : SaveDataSystemComponent::Implementation(saveDataSystemComponent)
  71. , m_saveDataDircetoryPathAbsolute(GetDefaultAndroidUserSaveDataPath() +
  72. DefaultSaveDataDirectoryName + "/")
  73. {
  74. }
  75. ////////////////////////////////////////////////////////////////////////////////////////////////
  76. SaveDataSystemComponentAndroid::~SaveDataSystemComponentAndroid()
  77. {
  78. }
  79. ////////////////////////////////////////////////////////////////////////////////////////////////
  80. void SaveDataSystemComponentAndroid::SaveDataBuffer(const SaveDataRequests::SaveDataBufferParams& saveDataBufferParams)
  81. {
  82. const AZStd::string& absoluteFilePath = GetSaveDataFilePath(saveDataBufferParams.dataBufferName,
  83. saveDataBufferParams.localUserId);
  84. SaveDataBufferToFileSystem(saveDataBufferParams, absoluteFilePath);
  85. }
  86. ////////////////////////////////////////////////////////////////////////////////////////////////
  87. void SaveDataSystemComponentAndroid::LoadDataBuffer(const SaveDataRequests::LoadDataBufferParams& loadDataBufferParams)
  88. {
  89. const AZStd::string& absoluteFilePath = GetSaveDataFilePath(loadDataBufferParams.dataBufferName,
  90. loadDataBufferParams.localUserId);
  91. LoadDataBufferFromFileSystem(loadDataBufferParams, absoluteFilePath);
  92. }
  93. ////////////////////////////////////////////////////////////////////////////////////////////////
  94. void SaveDataSystemComponentAndroid::SetSaveDataDirectoryPath(const char* saveDataDirectoryPath)
  95. {
  96. if (IsAbsolutePath(saveDataDirectoryPath))
  97. {
  98. m_saveDataDircetoryPathAbsolute = saveDataDirectoryPath;
  99. }
  100. else
  101. {
  102. m_saveDataDircetoryPathAbsolute = GetDefaultAndroidUserSaveDataPath() + saveDataDirectoryPath;
  103. }
  104. AZ_Assert(!m_saveDataDircetoryPathAbsolute.empty(), "Cannot set an empty save data directory path.");
  105. // Append the trailing path separator if needed
  106. if (m_saveDataDircetoryPathAbsolute.back() != '/' ||
  107. m_saveDataDircetoryPathAbsolute.back() != '\\')
  108. {
  109. m_saveDataDircetoryPathAbsolute += '/';
  110. }
  111. }
  112. ////////////////////////////////////////////////////////////////////////////////////////////////
  113. AZStd::string SaveDataSystemComponentAndroid::GetSaveDataFilePath(const AZStd::string& dataBufferName,
  114. AzFramework::LocalUserId localUserId)
  115. {
  116. AZStd::string saveDataFilePath = m_saveDataDircetoryPathAbsolute;
  117. if (localUserId != AzFramework::LocalUserIdNone)
  118. {
  119. saveDataFilePath += AZStd::string::format("User_%u/", localUserId);
  120. }
  121. saveDataFilePath += dataBufferName;
  122. return saveDataFilePath;
  123. }
  124. } // namespace SaveData