CacheServerData.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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 <native/ui/CacheServerData.h>
  9. #include <native/utilities/AssetServerHandler.h>
  10. #include <AzCore/IO/Path/Path.h>
  11. #include <AzCore/JSON/document.h>
  12. #include <AzCore/JSON/stringbuffer.h>
  13. #include <AzCore/JSON/prettywriter.h>
  14. #include <AzCore/JSON/pointer.h>
  15. #include <QFile>
  16. #include <QTextStream>
  17. namespace AssetProcessor
  18. {
  19. void CacheServerData::Reset()
  20. {
  21. auto* recognizerConfiguration = AZ::Interface<AssetProcessor::RecognizerConfiguration>::Get();
  22. if (recognizerConfiguration)
  23. {
  24. m_patternContainer = recognizerConfiguration->GetAssetCacheRecognizerContainer();
  25. }
  26. using namespace AssetProcessor;
  27. AssetServerBus::BroadcastResult(m_cachingMode, &AssetServerBus::Events::GetRemoteCachingMode);
  28. AssetServerBus::BroadcastResult(m_serverAddress, &AssetServerBus::Events::GetServerAddress);
  29. m_dirty = false;
  30. }
  31. bool CacheServerData::Save(const AZ::IO::Path& projectPath)
  32. {
  33. // construct JSON for writing out a .setreg for current settings
  34. rapidjson::Document doc;
  35. doc.SetObject();
  36. // this builds up the JSON doc for each key inside AssetProcessorSettingsKey
  37. AZStd::string path;
  38. AZ::StringFunc::TokenizeVisitor(
  39. AssetProcessor::AssetProcessorServerKey,
  40. [&doc, &path](AZStd::string_view elem)
  41. {
  42. auto key = rapidjson::StringRef(elem.data(), elem.size());
  43. rapidjson::Value value(rapidjson::kObjectType);
  44. if (path.empty())
  45. {
  46. doc.AddMember(key, value, doc.GetAllocator());
  47. }
  48. else
  49. {
  50. auto* node = rapidjson::Pointer(path.c_str(), path.size()).Get(doc);
  51. node->AddMember(key, value, doc.GetAllocator());
  52. }
  53. path += "/";
  54. path += elem;
  55. },
  56. '/');
  57. // creates a rapidjson doc to hold the shared cache server settings
  58. rapidjson::Value value(rapidjson::kObjectType);
  59. auto server = rapidjson::Pointer(AssetProcessor::AssetProcessorServerKey).Get(doc);
  60. server->AddMember(
  61. rapidjson::StringRef(AssetProcessor::CacheServerAddressKey),
  62. rapidjson::StringRef(m_serverAddress.c_str()),
  63. doc.GetAllocator());
  64. server->AddMember(
  65. rapidjson::StringRef(AssetProcessor::AssetCacheServerModeKey),
  66. rapidjson::StringRef(AssetProcessor::AssetServerHandler::GetAssetServerModeText(m_cachingMode)),
  67. doc.GetAllocator());
  68. // add the cache patterns
  69. AZStd::string jsonText;
  70. AssetProcessor::PlatformConfiguration::ConvertToJson(m_patternContainer, jsonText);
  71. if (!jsonText.empty())
  72. {
  73. rapidjson::Document recognizerDoc;
  74. recognizerDoc.Parse(jsonText.c_str());
  75. for (auto member = recognizerDoc.MemberBegin(); member != recognizerDoc.MemberEnd(); ++member)
  76. {
  77. rapidjson::Value valuePattern;
  78. valuePattern.CopyFrom(member->value, doc.GetAllocator(), true);
  79. rapidjson::Value valueKey;
  80. valueKey.CopyFrom(member->name, doc.GetAllocator(), true);
  81. server->AddMember(AZStd::move(valueKey), AZStd::move(valuePattern), doc.GetAllocator());
  82. }
  83. }
  84. // get project folder and construct Registry project folder
  85. const char* assetCacheServerSettings = "asset_cache_server_settings.setreg";
  86. AZ::IO::Path fullpath( projectPath );
  87. fullpath /= "Registry";
  88. fullpath /= assetCacheServerSettings;
  89. QFile file(fullpath.c_str());
  90. bool result = file.open(QIODevice::ReadWrite);
  91. if (result)
  92. {
  93. rapidjson::StringBuffer buffer;
  94. rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer);
  95. doc.Accept(writer);
  96. // rewrite the file contents
  97. file.resize(0);
  98. QTextStream stream(&file);
  99. stream.setCodec("UTF-8");
  100. stream << buffer.GetString();
  101. m_statusLevel = StatusLevel::Notice;
  102. m_statusMessage = AZStd::string::format("Updated settings file (%s)", fullpath.c_str());
  103. m_updateStatus = true;
  104. }
  105. else
  106. {
  107. m_statusLevel = StatusLevel::Error;
  108. m_statusMessage = AZStd::string::format("**Error**: Could not write settings file (%s)", fullpath.c_str());
  109. m_updateStatus = false;
  110. }
  111. file.close();
  112. return result;
  113. }
  114. }