manager.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // Copyright 2019 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "common/assert.h"
  5. #include "common/logging/log.h"
  6. #include "common/string_util.h"
  7. #include "core/hle/service/lm/manager.h"
  8. #include "core/reporter.h"
  9. namespace Service::LM {
  10. std::ostream& operator<<(std::ostream& os, DestinationFlag dest) {
  11. std::vector<std::string> array;
  12. const auto check_single_flag = [dest, &array](DestinationFlag check, std::string name) {
  13. if ((static_cast<u32>(check) & static_cast<u32>(dest)) != 0) {
  14. array.emplace_back(std::move(name));
  15. }
  16. };
  17. check_single_flag(DestinationFlag::Default, "Default");
  18. check_single_flag(DestinationFlag::UART, "UART");
  19. check_single_flag(DestinationFlag::UARTSleeping, "UART (Sleeping)");
  20. os << "[";
  21. for (const auto& entry : array) {
  22. os << entry << ", ";
  23. }
  24. return os << "]";
  25. }
  26. std::ostream& operator<<(std::ostream& os, MessageHeader::Severity severity) {
  27. switch (severity) {
  28. case MessageHeader::Severity::Trace:
  29. return os << "Trace";
  30. case MessageHeader::Severity::Info:
  31. return os << "Info";
  32. case MessageHeader::Severity::Warning:
  33. return os << "Warning";
  34. case MessageHeader::Severity::Error:
  35. return os << "Error";
  36. case MessageHeader::Severity::Critical:
  37. return os << "Critical";
  38. default:
  39. return os << fmt::format("{:08X}", static_cast<u32>(severity));
  40. }
  41. }
  42. std::ostream& operator<<(std::ostream& os, Field field) {
  43. switch (field) {
  44. case Field::Skip:
  45. return os << "Skip";
  46. case Field::Message:
  47. return os << "Message";
  48. case Field::Line:
  49. return os << "Line";
  50. case Field::Filename:
  51. return os << "Filename";
  52. case Field::Function:
  53. return os << "Function";
  54. case Field::Module:
  55. return os << "Module";
  56. case Field::Thread:
  57. return os << "Thread";
  58. default:
  59. return os << fmt::format("{:08X}", static_cast<u32>(field));
  60. }
  61. }
  62. std::string FormatField(Field type, const std::vector<u8>& data) {
  63. switch (type) {
  64. case Field::Skip:
  65. return "";
  66. case Field::Line:
  67. if (data.size() >= sizeof(u32)) {
  68. u32 line;
  69. std::memcpy(&line, data.data(), sizeof(u32));
  70. return fmt::format("{}", line);
  71. }
  72. return "[ERROR DECODING LINE NUMBER]";
  73. case Field::Message:
  74. case Field::Filename:
  75. case Field::Function:
  76. case Field::Module:
  77. case Field::Thread:
  78. return Common::StringFromFixedZeroTerminatedBuffer(
  79. reinterpret_cast<const char*>(data.data()), data.size());
  80. default:
  81. UNIMPLEMENTED();
  82. }
  83. }
  84. Manager::Manager(Core::Reporter& reporter) : reporter(reporter) {}
  85. Manager::~Manager() = default;
  86. void Manager::SetEnabled(bool enabled) {
  87. this->enabled = enabled;
  88. }
  89. void Manager::SetDestination(DestinationFlag destination) {
  90. this->destination = destination;
  91. }
  92. void Manager::Log(LogMessage message) {
  93. if (message.header.IsHeadLog()) {
  94. InitializeLog();
  95. }
  96. current_log.emplace_back(std::move(message));
  97. if (current_log.back().header.IsTailLog()) {
  98. FinalizeLog();
  99. }
  100. }
  101. void Manager::Flush() {
  102. FinalizeLog();
  103. }
  104. void Manager::InitializeLog() {
  105. current_log.clear();
  106. LOG_INFO(Service_LM, "Initialized new log session");
  107. }
  108. void Manager::FinalizeLog() {
  109. reporter.SaveLogReport(static_cast<u32>(destination), std::move(current_log));
  110. LOG_INFO(Service_LM, "Finalized current log session");
  111. }
  112. } // namespace Service::LM