Settings.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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 <Settings.h>
  9. #include <AzCore/Settings/SettingsRegistryMergeUtils.h>
  10. #include <AzCore/IO/ByteContainerStream.h>
  11. #include <AzCore/Utils/Utils.h>
  12. namespace O3DE::ProjectManager
  13. {
  14. Settings::Settings(bool saveToDisk)
  15. : m_saveToDisk(saveToDisk)
  16. {
  17. m_settingsRegistry = AZ::SettingsRegistry::Get();
  18. AZ_Assert(m_settingsRegistry, "Failed to create Settings");
  19. }
  20. void Settings::Save()
  21. {
  22. AZ::SettingsRegistryMergeUtils::DumperSettings dumperSettings;
  23. dumperSettings.m_prettifyOutput = true;
  24. dumperSettings.m_jsonPointerPrefix = ProjectManagerKeyPrefix;
  25. AZStd::string stringBuffer;
  26. AZ::IO::ByteContainerStream stringStream(&stringBuffer);
  27. if (!AZ::SettingsRegistryMergeUtils::DumpSettingsRegistryToStream(
  28. *m_settingsRegistry, ProjectManagerKeyPrefix, stringStream, dumperSettings))
  29. {
  30. AZ_Warning("ProjectManager", false, "Could not save Project Manager settings to stream");
  31. return;
  32. }
  33. AZ::IO::FixedMaxPath o3deUserPath = AZ::Utils::GetO3deManifestDirectory();
  34. o3deUserPath /= AZ::SettingsRegistryInterface::RegistryFolder;
  35. o3deUserPath /= "ProjectManager.setreg";
  36. [[maybe_unused]] bool saved = false;
  37. constexpr auto configurationMode =
  38. AZ::IO::SystemFile::SF_OPEN_CREATE | AZ::IO::SystemFile::SF_OPEN_CREATE_PATH | AZ::IO::SystemFile::SF_OPEN_WRITE_ONLY;
  39. AZ::IO::SystemFile outputFile;
  40. if (outputFile.Open(o3deUserPath.c_str(), configurationMode))
  41. {
  42. saved = outputFile.Write(stringBuffer.data(), stringBuffer.size()) == stringBuffer.size();
  43. }
  44. AZ_Warning("ProjectManager", saved, "Unable to save Project Manager registry file to path: %s", o3deUserPath.c_str());
  45. }
  46. void Settings::OnSettingsChanged()
  47. {
  48. if (m_saveToDisk)
  49. {
  50. Save();
  51. }
  52. }
  53. bool Settings::Get(QString& result, const QString& settingsKey)
  54. {
  55. bool success = false;
  56. AZStd::string settingsValue;
  57. success = m_settingsRegistry->Get(settingsValue, settingsKey.toStdString().c_str());
  58. result = settingsValue.c_str();
  59. return success;
  60. }
  61. bool Settings::Get(bool& result, const QString& settingsKey)
  62. {
  63. return m_settingsRegistry->Get(result, settingsKey.toStdString().c_str());
  64. }
  65. bool Settings::Set(const QString& settingsKey, const QString& settingsValue)
  66. {
  67. bool success = false;
  68. success = m_settingsRegistry->Set(settingsKey.toStdString().c_str(), settingsValue.toStdString().c_str());
  69. OnSettingsChanged();
  70. return success;
  71. }
  72. bool Settings::Set(const QString& settingsKey, bool settingsValue)
  73. {
  74. bool success = false;
  75. success = m_settingsRegistry->Set(settingsKey.toStdString().c_str(), settingsValue);
  76. OnSettingsChanged();
  77. return success;
  78. }
  79. bool Settings::Remove(const QString& settingsKey)
  80. {
  81. bool success = false;
  82. success = m_settingsRegistry->Remove(settingsKey.toStdString().c_str());
  83. OnSettingsChanged();
  84. return success;
  85. }
  86. bool Settings::Copy(const QString& settingsKeyOrig, const QString& settingsKeyDest, bool removeOrig)
  87. {
  88. bool success = false;
  89. AZStd::string settingsValue;
  90. success = m_settingsRegistry->Get(settingsValue, settingsKeyOrig.toStdString().c_str());
  91. if (success)
  92. {
  93. success = m_settingsRegistry->Set(settingsKeyDest.toStdString().c_str(), settingsValue);
  94. if (success)
  95. {
  96. if (removeOrig)
  97. {
  98. success = m_settingsRegistry->Remove(settingsKeyOrig.toStdString().c_str());
  99. }
  100. OnSettingsChanged();
  101. }
  102. }
  103. return success;
  104. }
  105. QString Settings::GetProjectKey(const ProjectInfo& projectInfo)
  106. {
  107. return QString("%1/Projects/%2/%3").arg(ProjectManagerKeyPrefix, projectInfo.m_id, projectInfo.m_projectName);
  108. }
  109. bool Settings::GetBuiltSuccessfullyPaths(AZStd::set<AZStd::string>& result)
  110. {
  111. return m_settingsRegistry->GetObject<AZStd::set<AZStd::string>>(result, ProjectsBuiltSuccessfullyKey);
  112. }
  113. bool Settings::GetProjectBuiltSuccessfully(bool& result, const ProjectInfo& projectInfo)
  114. {
  115. AZStd::set<AZStd::string> builtPathsResult;
  116. bool success = GetBuiltSuccessfullyPaths(builtPathsResult);
  117. // Check if buildPath is listed as successfully built
  118. AZStd::string projectPath = projectInfo.m_path.toStdString().c_str();
  119. AZ::IO::FixedMaxPath lexicallyNormalPath = AZ::IO::FixedMaxPath(projectPath).LexicallyNormal();
  120. if (builtPathsResult.contains(lexicallyNormalPath.c_str()))
  121. {
  122. result = true;
  123. }
  124. // No project built statuses known
  125. else
  126. {
  127. result = false;
  128. }
  129. return success;
  130. }
  131. bool Settings::SetProjectBuiltSuccessfully(const ProjectInfo& projectInfo, bool successfullyBuilt)
  132. {
  133. AZStd::set<AZStd::string> builtPathsResult;
  134. bool success = GetBuiltSuccessfullyPaths(builtPathsResult);
  135. AZStd::string projectPath = projectInfo.m_path.toStdString().c_str();
  136. AZ::IO::FixedMaxPath lexicallyNormalPath = AZ::IO::FixedMaxPath(projectPath).LexicallyNormal();
  137. if (successfullyBuilt)
  138. {
  139. //Add successfully built path to set
  140. builtPathsResult.insert(lexicallyNormalPath.c_str());
  141. }
  142. else
  143. {
  144. // Remove unsuccessfully built path from set
  145. builtPathsResult.erase(lexicallyNormalPath.c_str());
  146. }
  147. success = m_settingsRegistry->SetObject<AZStd::set<AZStd::string>>(ProjectsBuiltSuccessfullyKey, builtPathsResult);
  148. OnSettingsChanged();
  149. return success;
  150. }
  151. } // namespace O3DE::ProjectManager