tz_content_man: Generate the time zone binary once
Fixes a memory leak with time zone binaries accumulating on theirselves.
This commit is contained in:
		| @@ -3,6 +3,7 @@ | |||||||
|  |  | ||||||
| #include <chrono> | #include <chrono> | ||||||
| #include <sstream> | #include <sstream> | ||||||
|  | #include <utility> | ||||||
|  |  | ||||||
| #include "common/logging/log.h" | #include "common/logging/log.h" | ||||||
| #include "common/settings.h" | #include "common/settings.h" | ||||||
| @@ -46,14 +47,14 @@ static FileSys::VirtualDir GetTimeZoneBinary(Core::System& system) { | |||||||
|     return FileSys::ExtractRomFS(romfs); |     return FileSys::ExtractRomFS(romfs); | ||||||
| } | } | ||||||
|  |  | ||||||
| static std::vector<std::string> BuildLocationNameCache(Core::System& system) { | static std::vector<std::string> BuildLocationNameCache( | ||||||
|     const FileSys::VirtualDir extracted_romfs{GetTimeZoneBinary(system)}; |     const FileSys::VirtualDir& time_zone_binary) { | ||||||
|     if (!extracted_romfs) { |     if (!time_zone_binary) { | ||||||
|         LOG_ERROR(Service_Time, "Failed to extract RomFS for {:016X}!", time_zone_binary_titleid); |         LOG_ERROR(Service_Time, "Failed to extract RomFS for {:016X}!", time_zone_binary_titleid); | ||||||
|         return {}; |         return {}; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     const FileSys::VirtualFile binary_list{extracted_romfs->GetFile("binaryList.txt")}; |     const FileSys::VirtualFile binary_list{time_zone_binary->GetFile("binaryList.txt")}; | ||||||
|     if (!binary_list) { |     if (!binary_list) { | ||||||
|         LOG_ERROR(Service_Time, "{:016X} has no file binaryList.txt!", time_zone_binary_titleid); |         LOG_ERROR(Service_Time, "{:016X} has no file binaryList.txt!", time_zone_binary_titleid); | ||||||
|         return {}; |         return {}; | ||||||
| @@ -73,7 +74,8 @@ static std::vector<std::string> BuildLocationNameCache(Core::System& system) { | |||||||
| } | } | ||||||
|  |  | ||||||
| TimeZoneContentManager::TimeZoneContentManager(Core::System& system_) | TimeZoneContentManager::TimeZoneContentManager(Core::System& system_) | ||||||
|     : system{system_}, location_name_cache{BuildLocationNameCache(system)} {} |     : system{system_}, time_zone_binary{GetTimeZoneBinary(system)}, | ||||||
|  |       location_name_cache{BuildLocationNameCache(time_zone_binary)} {} | ||||||
|  |  | ||||||
| void TimeZoneContentManager::Initialize(TimeManager& time_manager) { | void TimeZoneContentManager::Initialize(TimeManager& time_manager) { | ||||||
|     const auto timezone_setting = Settings::GetTimeZoneString(); |     const auto timezone_setting = Settings::GetTimeZoneString(); | ||||||
| @@ -111,13 +113,12 @@ Result TimeZoneContentManager::GetTimeZoneInfoFile(const std::string& location_n | |||||||
|         return ERROR_TIME_NOT_FOUND; |         return ERROR_TIME_NOT_FOUND; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     const FileSys::VirtualDir extracted_romfs{GetTimeZoneBinary(system)}; |     if (!time_zone_binary) { | ||||||
|     if (!extracted_romfs) { |  | ||||||
|         LOG_ERROR(Service_Time, "Failed to extract RomFS for {:016X}!", time_zone_binary_titleid); |         LOG_ERROR(Service_Time, "Failed to extract RomFS for {:016X}!", time_zone_binary_titleid); | ||||||
|         return ERROR_TIME_NOT_FOUND; |         return ERROR_TIME_NOT_FOUND; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     const FileSys::VirtualDir zoneinfo_dir{extracted_romfs->GetSubdirectory("zoneinfo")}; |     const FileSys::VirtualDir zoneinfo_dir{time_zone_binary->GetSubdirectory("zoneinfo")}; | ||||||
|     if (!zoneinfo_dir) { |     if (!zoneinfo_dir) { | ||||||
|         LOG_ERROR(Service_Time, "{:016X} has no directory zoneinfo!", time_zone_binary_titleid); |         LOG_ERROR(Service_Time, "{:016X} has no directory zoneinfo!", time_zone_binary_titleid); | ||||||
|         return ERROR_TIME_NOT_FOUND; |         return ERROR_TIME_NOT_FOUND; | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ | |||||||
| #include <string> | #include <string> | ||||||
| #include <vector> | #include <vector> | ||||||
|  |  | ||||||
|  | #include "core/file_sys/vfs_types.h" | ||||||
| #include "core/hle/service/time/time_zone_manager.h" | #include "core/hle/service/time/time_zone_manager.h" | ||||||
|  |  | ||||||
| namespace Core { | namespace Core { | ||||||
| @@ -41,6 +42,7 @@ private: | |||||||
|  |  | ||||||
|     Core::System& system; |     Core::System& system; | ||||||
|     TimeZoneManager time_zone_manager; |     TimeZoneManager time_zone_manager; | ||||||
|  |     const FileSys::VirtualDir time_zone_binary; | ||||||
|     const std::vector<std::string> location_name_cache; |     const std::vector<std::string> location_name_cache; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 lat9nq
					lat9nq