mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Fix self updating ncch app jump
This commit is contained in:
		
							parent
							
								
									c49379442d
								
							
						
					
					
						commit
						d396944487
					
				
					 5 changed files with 29 additions and 13 deletions
				
			
		|  | @ -738,10 +738,6 @@ void SetCurrentRomPath(const std::string& path) { | ||||||
|     g_currentRomPath = path; |     g_currentRomPath = path; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const std::string& GetCurrentRomPath() { |  | ||||||
|     return g_currentRomPath; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool StringReplace(std::string& haystack, const std::string& a, const std::string& b, bool swap) { | bool StringReplace(std::string& haystack, const std::string& a, const std::string& b, bool swap) { | ||||||
|     const auto& needle = swap ? b : a; |     const auto& needle = swap ? b : a; | ||||||
|     const auto& replacement = swap ? a : b; |     const auto& replacement = swap ? a : b; | ||||||
|  |  | ||||||
|  | @ -182,8 +182,6 @@ void SetUserPath(const std::string& path = ""); | ||||||
| 
 | 
 | ||||||
| void SetCurrentRomPath(const std::string& path); | void SetCurrentRomPath(const std::string& path); | ||||||
| 
 | 
 | ||||||
| const std::string& GetCurrentRomPath(); |  | ||||||
| 
 |  | ||||||
| // Returns a pointer to a string with a Citra data dir in the user's home
 | // Returns a pointer to a string with a Citra data dir in the user's home
 | ||||||
| // directory. To be used in "multi-user" mode (that is, installed).
 | // directory. To be used in "multi-user" mode (that is, installed).
 | ||||||
| [[nodiscard]] const std::string& GetUserPath(UserPath path); | [[nodiscard]] const std::string& GetUserPath(UserPath path); | ||||||
|  |  | ||||||
|  | @ -31,6 +31,7 @@ | ||||||
| #include "core/hle/kernel/kernel.h" | #include "core/hle/kernel/kernel.h" | ||||||
| #include "core/hle/kernel/process.h" | #include "core/hle/kernel/process.h" | ||||||
| #include "core/hle/kernel/thread.h" | #include "core/hle/kernel/thread.h" | ||||||
|  | #include "core/hle/service/am/am.h" | ||||||
| #include "core/hle/service/apt/applet_manager.h" | #include "core/hle/service/apt/applet_manager.h" | ||||||
| #include "core/hle/service/apt/apt.h" | #include "core/hle/service/apt/apt.h" | ||||||
| #include "core/hle/service/fs/archive.h" | #include "core/hle/service/fs/archive.h" | ||||||
|  | @ -575,8 +576,25 @@ void System::Reset() { | ||||||
|         deliver_arg = apt->GetAppletManager()->ReceiveDeliverArg(); |         deliver_arg = apt->GetAppletManager()->ReceiveDeliverArg(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     bool was_self_delete_pending = self_delete_pending; | ||||||
|  | 
 | ||||||
|     Shutdown(); |     Shutdown(); | ||||||
| 
 | 
 | ||||||
|  |     // Self updating apps may launch themselves after the update, if that's the case
 | ||||||
|  |     // find the new path to launch.
 | ||||||
|  |     if (was_self_delete_pending) { | ||||||
|  |         // TODO: We can get the title id, but not the MediaType, so we
 | ||||||
|  |         // check both NAND and SDMC mediatypes.
 | ||||||
|  |         m_filepath = Service::AM::GetTitleContentPath(Service::FS::MediaType::NAND, title_id); | ||||||
|  |         if (m_filepath.empty() || !FileUtil::Exists(m_filepath)) { | ||||||
|  |             m_filepath = Service::AM::GetTitleContentPath(Service::FS::MediaType::SDMC, title_id); | ||||||
|  |             if (m_filepath.empty() || !FileUtil::Exists(m_filepath)) { | ||||||
|  |                 LOG_CRITICAL(Core, "Failed to get application path for system reset"); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     // Reload the system with the same setting
 |     // Reload the system with the same setting
 | ||||||
|     [[maybe_unused]] const System::ResultStatus result = Load(*m_emu_window, m_filepath); |     [[maybe_unused]] const System::ResultStatus result = Load(*m_emu_window, m_filepath); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -306,9 +306,12 @@ public: | ||||||
|     void LoadState(u32 slot); |     void LoadState(u32 slot); | ||||||
| 
 | 
 | ||||||
|     /// Self delete ncch
 |     /// Self delete ncch
 | ||||||
|     void SetSelfDelete(const std::string& file) { |     bool SetSelfDelete(const std::string& file) { | ||||||
|         if (m_filepath == file) |         if (m_filepath == file) { | ||||||
|             self_delete_pending = true; |             self_delete_pending = true; | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |  | ||||||
|  | @ -318,12 +318,13 @@ bool CIAFile::Close() const { | ||||||
|             if (abort) |             if (abort) | ||||||
|                 break; |                 break; | ||||||
| 
 | 
 | ||||||
|             // Try deleting the file, if it fails it's because it's the currently running file
 |             // If the file to delete is the current launched rom, signal the system to delete
 | ||||||
|             // and we are on windows. In that case, let system know to delete the currently
 |             // the current rom instead of deleting it now, once all the handles to the file
 | ||||||
|             // running file once it shuts down.
 |             // are closed.
 | ||||||
|             std::string toDelete = GetTitleContentPath(media_type, old_tmd.GetTitleID(), old_index); |             std::string toDelete = GetTitleContentPath(media_type, old_tmd.GetTitleID(), old_index); | ||||||
|             if (!FileUtil::Delete(toDelete) && FileUtil::GetCurrentRomPath() == toDelete) |             if (!(Core::System::GetInstance().IsPoweredOn() && | ||||||
|                 Core::System::GetInstance().SetSelfDelete(toDelete); |                   Core::System::GetInstance().SetSelfDelete(toDelete))) | ||||||
|  |                 FileUtil::Delete(toDelete); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         FileUtil::Delete(old_tmd_path); |         FileUtil::Delete(old_tmd_path); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue