caps_manager.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <unordered_map>
  5. #include "common/fs/fs.h"
  6. #include "core/hle/result.h"
  7. #include "core/hle/service/caps/caps_types.h"
  8. namespace Core {
  9. class System;
  10. }
  11. namespace std {
  12. // Hash used to create lists from AlbumFileId data
  13. template <>
  14. struct hash<Service::Capture::AlbumFileId> {
  15. size_t operator()(const Service::Capture::AlbumFileId& pad_id) const noexcept {
  16. u64 hash_value = (static_cast<u64>(pad_id.date.year) << 8);
  17. hash_value ^= (static_cast<u64>(pad_id.date.month) << 7);
  18. hash_value ^= (static_cast<u64>(pad_id.date.day) << 6);
  19. hash_value ^= (static_cast<u64>(pad_id.date.hour) << 5);
  20. hash_value ^= (static_cast<u64>(pad_id.date.minute) << 4);
  21. hash_value ^= (static_cast<u64>(pad_id.date.second) << 3);
  22. hash_value ^= (static_cast<u64>(pad_id.date.unique_id) << 2);
  23. hash_value ^= (static_cast<u64>(pad_id.storage) << 1);
  24. hash_value ^= static_cast<u64>(pad_id.type);
  25. return static_cast<size_t>(hash_value);
  26. }
  27. };
  28. } // namespace std
  29. namespace Service::Capture {
  30. class AlbumManager {
  31. public:
  32. explicit AlbumManager();
  33. ~AlbumManager();
  34. Result DeleteAlbumFile(const AlbumFileId& file_id);
  35. Result IsAlbumMounted(AlbumStorage storage);
  36. Result GetAlbumFileList(std::vector<AlbumEntry>& out_entries, AlbumStorage storage,
  37. u8 flags) const;
  38. Result GetAlbumFileList(std::vector<ApplicationAlbumFileEntry>& out_entries,
  39. ContentType contex_type, AlbumFileDateTime start_date,
  40. AlbumFileDateTime end_date, u64 aruid) const;
  41. Result GetAutoSavingStorage(bool& out_is_autosaving) const;
  42. Result LoadAlbumScreenShotImage(LoadAlbumScreenShotImageOutput& out_image_output,
  43. std::vector<u8>& out_image, const AlbumFileId& file_id,
  44. const ScreenShotDecodeOption& decoder_options) const;
  45. Result LoadAlbumScreenShotThumbnail(LoadAlbumScreenShotImageOutput& out_image_output,
  46. std::vector<u8>& out_image, const AlbumFileId& file_id,
  47. const ScreenShotDecodeOption& decoder_options) const;
  48. private:
  49. static constexpr std::size_t NandAlbumFileLimit = 1000;
  50. static constexpr std::size_t SdAlbumFileLimit = 10000;
  51. void FindScreenshots();
  52. Result GetFile(std::filesystem::path& out_path, const AlbumFileId& file_id) const;
  53. Result GetAlbumEntry(AlbumEntry& out_entry, const std::filesystem::path& path) const;
  54. Result LoadImage(std::span<u8> out_image, const std::filesystem::path& path, int width,
  55. int height, ScreenShotDecoderFlag flag) const;
  56. bool is_mounted{};
  57. std::unordered_map<AlbumFileId, std::filesystem::path> album_files;
  58. };
  59. } // namespace Service::Capture