steam_targets.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include "steam_targets.h"
  2. #include <array>
  3. #include "../patterns/steam.h"
  4. namespace sunrise::client::targets::steam {
  5. namespace {
  6. Targets g_targets;
  7. }
  8. /** Resolves every required Steam networking target as one complete table. */
  9. bool resolve(std::span<const patterns::ImageRange> image) noexcept {
  10. g_targets = {};
  11. const auto definitions = patterns::steam::definitions();
  12. std::array<patterns::Match, static_cast<std::size_t>(patterns::steam::Id::count)> matches{};
  13. if (!patterns::resolve_all(image, definitions, matches)) {
  14. return false;
  15. }
  16. for (const patterns::Match match : matches) {
  17. if (match.status != patterns::MatchStatus::unique) {
  18. return false;
  19. }
  20. }
  21. Targets resolved;
  22. resolved.authenticationStatus =
  23. matches[static_cast<std::size_t>(patterns::steam::Id::authenticationStatus)].address;
  24. resolved.setCertificate =
  25. matches[static_cast<std::size_t>(patterns::steam::Id::setCertificate)].address;
  26. // Publish only after every required address has been validated.
  27. g_targets = resolved;
  28. return true;
  29. }
  30. /** Clears every published Steam networking hook target. */
  31. void clear() noexcept {
  32. g_targets = {};
  33. }
  34. /** @return Current immutable Steam networking hook target table. */
  35. const Targets& get() noexcept {
  36. return g_targets;
  37. }
  38. } // namespace sunrise::client::targets::steam