mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-11-03 23:28:48 +00:00 
			
		
		
		
	Merge pull request #6168 from PabloMK7/cia_update_fix
Fix handling of auto-updating ncch apps
This commit is contained in:
		
						commit
						38b8bf12de
					
				
					 4 changed files with 54 additions and 10 deletions
				
			
		| 
						 | 
				
			
			@ -315,7 +315,14 @@ bool CIAFile::Close() const {
 | 
			
		|||
            if (abort)
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            FileUtil::Delete(GetTitleContentPath(media_type, old_tmd.GetTitleID(), old_index));
 | 
			
		||||
            // If the file to delete is the current launched rom, signal the system to delete
 | 
			
		||||
            // the current rom instead of deleting it now, once all the handles to the file
 | 
			
		||||
            // are closed.
 | 
			
		||||
            std::string to_delete =
 | 
			
		||||
                GetTitleContentPath(media_type, old_tmd.GetTitleID(), old_index);
 | 
			
		||||
            if (!(Core::System::GetInstance().IsPoweredOn() &&
 | 
			
		||||
                  Core::System::GetInstance().SetSelfDelete(to_delete)))
 | 
			
		||||
                FileUtil::Delete(to_delete);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        FileUtil::Delete(old_tmd_path);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@
 | 
			
		|||
 | 
			
		||||
#include "core/core.h"
 | 
			
		||||
#include "core/hle/applets/applet.h"
 | 
			
		||||
#include "core/hle/service/am/am.h"
 | 
			
		||||
#include "core/hle/service/apt/applet_manager.h"
 | 
			
		||||
#include "core/hle/service/apt/errors.h"
 | 
			
		||||
#include "core/hle/service/apt/ns.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -545,17 +546,30 @@ ResultCode AppletManager::DoApplicationJump(DeliverArg arg) {
 | 
			
		|||
    // prompts it to call GetProgramIdOnApplicationJump and
 | 
			
		||||
    // PrepareToStartApplication/StartApplication on the title to launch.
 | 
			
		||||
 | 
			
		||||
    if (app_jump_parameters.next_title_id == app_jump_parameters.current_title_id) {
 | 
			
		||||
        // Perform a soft-reset if we're trying to relaunch the same title.
 | 
			
		||||
        // TODO(Subv): Note that this reboots the entire emulated system, a better way would be to
 | 
			
		||||
        // simply re-launch the title without closing all services, but this would only work for
 | 
			
		||||
        // installed titles since we have no way of getting the file path of an arbitrary game dump
 | 
			
		||||
        // based only on the title id.
 | 
			
		||||
        system.RequestReset();
 | 
			
		||||
        return RESULT_SUCCESS;
 | 
			
		||||
    // Perform a soft-reset if we're trying to relaunch the same title.
 | 
			
		||||
    // TODO(Subv): Note that this reboots the entire emulated system, a better way would be to
 | 
			
		||||
    // simply re-launch the title without closing all services, but this would only work for
 | 
			
		||||
    // installed titles since we have no way of getting the file path of an arbitrary game dump
 | 
			
		||||
    // based only on the title id.
 | 
			
		||||
 | 
			
		||||
    std::string new_path = Service::AM::GetTitleContentPath(app_jump_parameters.next_media_type,
 | 
			
		||||
                                                            app_jump_parameters.next_title_id);
 | 
			
		||||
    if (new_path.empty() || !FileUtil::Exists(new_path)) {
 | 
			
		||||
        LOG_CRITICAL(
 | 
			
		||||
            Service_APT,
 | 
			
		||||
            "Failed to find title during application jump: {} Resetting current title instead.",
 | 
			
		||||
            new_path);
 | 
			
		||||
        new_path.clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    system.RequestReset(new_path);
 | 
			
		||||
    return RESULT_SUCCESS;
 | 
			
		||||
 | 
			
		||||
    // Launch the title directly.
 | 
			
		||||
    // The emulator does not suport terminating old processes, would require a lot of cleanup
 | 
			
		||||
    // This code is left commented for when this is implemented, for now we cannot use NS
 | 
			
		||||
    // as the old process resources would interfere with the new ones
 | 
			
		||||
    /*
 | 
			
		||||
    auto process =
 | 
			
		||||
        NS::LaunchTitle(app_jump_parameters.next_media_type, app_jump_parameters.next_title_id);
 | 
			
		||||
    if (!process) {
 | 
			
		||||
| 
						 | 
				
			
			@ -563,6 +577,7 @@ ResultCode AppletManager::DoApplicationJump(DeliverArg arg) {
 | 
			
		|||
        system.RequestShutdown();
 | 
			
		||||
    }
 | 
			
		||||
    return RESULT_SUCCESS;
 | 
			
		||||
    */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AppletManager::EnsureHomeMenuLoaded() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue