tadインポートに失敗した場合、一旦消去して再インポートを試みる仕様に変更。以下の問題を解消。

-SystemUpdaterでインポートしたタイトルに対する上書きインポートは鍵が異なるため失敗していた。
-バージョンダウンインポートはESで弾かれていた。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2865 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
kamikawa 2009-07-03 01:13:51 +00:00
parent 47f0d879c7
commit c5b78f0712
3 changed files with 49 additions and 31 deletions

View File

@ -79,11 +79,12 @@ BOOL kamiImportTad(NAMTitleId* pTitleID)
char savePublicPath[FS_ENTRY_LONGNAME_MAX]; char savePublicPath[FS_ENTRY_LONGNAME_MAX];
char savePrivatePath[FS_ENTRY_LONGNAME_MAX]; char savePrivatePath[FS_ENTRY_LONGNAME_MAX];
char subBannerPath[FS_ENTRY_LONGNAME_MAX]; char subBannerPath[FS_ENTRY_LONGNAME_MAX];
int i;
// 製品用CPUではインポート不可に // 製品用CPUではインポート不可に
if ( !((*(u8*)(OS_CHIPTYPE_DEBUGGER_ADDR) & OS_CHIPTYPE_DEBUGGER_MASK)) ) if ( !((*(u8*)(OS_CHIPTYPE_DEBUGGER_ADDR) & OS_CHIPTYPE_DEBUGGER_MASK)) )
{ {
OS_Warning(" Fail : Production CPU\n"); kamiFontPrintfConsoleEx(CONSOLE_RED, " Fail : Production CPU\n");
return FALSE; return FALSE;
} }
@ -93,14 +94,14 @@ BOOL kamiImportTad(NAMTitleId* pTitleID)
// CARD-ROM 領域を一時的なファイルとみなしそのファイルを開きます。 // CARD-ROM 領域を一時的なファイルとみなしそのファイルを開きます。
if (!FS_CreateFileFromRom(&file, GetImportJumpSetting()->tadRomOffset, GetImportJumpSetting()->tadLength)) if (!FS_CreateFileFromRom(&file, GetImportJumpSetting()->tadRomOffset, GetImportJumpSetting()->tadLength))
{ {
OS_Warning(" Fail : FS_CreateFileFromRom\n"); kamiFontPrintfConsoleEx(CONSOLE_RED, " Fail : FS_CreateFileFromRom\n");
return FALSE; return FALSE;
} }
// tadファイルの情報取得 // tadファイルの情報取得
if (NAM_ReadTadInfoWithFile(&tadInfo, &file) != NAM_OK) if (NAM_ReadTadInfoWithFile(&tadInfo, &file) != NAM_OK)
{ {
OS_Warning(" Fail! : NAM_ReadTadInfo\n"); kamiFontPrintfConsoleEx(CONSOLE_RED, " Fail! : NAM_ReadTadInfo\n");
return FALSE; return FALSE;
} }
@ -110,7 +111,7 @@ BOOL kamiImportTad(NAMTitleId* pTitleID)
// Data Only なら失敗 // Data Only なら失敗
if (tadInfo.titleInfo.titleId & TITLE_ID_DATA_ONLY_FLAG_MASK) if (tadInfo.titleInfo.titleId & TITLE_ID_DATA_ONLY_FLAG_MASK)
{ {
OS_Warning(" Fail! : DATA_ONLY_FLAG is specified in rsf file\n"); kamiFontPrintfConsoleEx(CONSOLE_RED, " Fail! : DATA_ONLY_FLAG is specified in rsf file\n");
return FALSE; return FALSE;
} }
@ -119,12 +120,12 @@ BOOL kamiImportTad(NAMTitleId* pTitleID)
u8 installed, free; u8 installed, free;
if (!NAMUT_GetSoftBoxCount(&installed, &free)) if (!NAMUT_GetSoftBoxCount(&installed, &free))
{ {
OS_Warning(" Fail! : Can not get soft box count\n"); kamiFontPrintfConsoleEx(CONSOLE_RED, " Fail! : Can not get soft box count\n");
return FALSE; return FALSE;
} }
if (free == 0) if (free == 0)
{ {
OS_Warning(" Fail! : NAND FreeSoftBoxCount == 0\n"); kamiFontPrintfConsoleEx(CONSOLE_RED, " Fail! : NAND FreeSoftBoxCount == 0\n");
return FALSE; return FALSE;
} }
} }
@ -139,40 +140,54 @@ BOOL kamiImportTad(NAMTitleId* pTitleID)
nam_result = NAM_DeleteTitleCompletely(tadInfo.titleInfo.titleId); nam_result = NAM_DeleteTitleCompletely(tadInfo.titleInfo.titleId);
if ( nam_result != NAM_OK ) if ( nam_result != NAM_OK )
{ {
kamiFontPrintfConsole(CONSOLE_RED, "Fail! RetCode=%x\n", nam_result); kamiFontPrintfConsoleEx(CONSOLE_RED, "Fail! RetCode=%x\n", nam_result);
return FALSE; return FALSE;
} }
*/ */
// インポート開始フラグを立てる for (i=0;i<2;i++)
sNowImport = TRUE; {
// インポート開始フラグを立てる
sNowImport = TRUE;
// 進捗スレッド作成 // 進捗スレッド作成
spStack = OS_Alloc(THREAD_STACK_SIZE); spStack = OS_Alloc(THREAD_STACK_SIZE);
MI_CpuClear8(spStack, THREAD_STACK_SIZE); MI_CpuClear8(spStack, THREAD_STACK_SIZE);
OS_CreateThread(&thread, ProgressThread, NULL, OS_CreateThread(&thread, ProgressThread, NULL,
(void*)((u32)spStack + THREAD_STACK_SIZE), THREAD_STACK_SIZE, OS_GetCurrentThread()->priority - 1); (void*)((u32)spStack + THREAD_STACK_SIZE), THREAD_STACK_SIZE, OS_GetCurrentThread()->priority - 1);
OS_SetThreadDestructor( &thread, Destructor ); OS_SetThreadDestructor( &thread, Destructor );
OS_WakeupThreadDirect(&thread); OS_WakeupThreadDirect(&thread);
// Import開始 // Import開始
nam_result = NAM_ImportTadWithFile( &file ); nam_result = NAM_ImportTadWithFile( &file );
// 進捗スレッドの自力終了を待つ // 進捗スレッドの自力終了を待つ
while (sNowImport){}; while (sNowImport){};
if ( nam_result == NAM_OK )
{
break;
}
else
{
// SystemUpdaterでインポートしたタイトルの上書きインポートには失敗する鍵が異なるため
// Tadのバージョンダウンは失敗するrsfのRemasterVersion
// よってインポートに失敗した場合でも一旦消去してから再トライする(一度のみ)
NAM_DeleteTitleCompletely(tadInfo.titleInfo.titleId);
}
}
if ( nam_result == NAM_OK ) if ( nam_result == NAM_OK )
{ {
// InstalledSoftBoxCount, FreeSoftBoxCount の値を現在のNANDの状態に合わせて更新します。 // InstalledSoftBoxCount, FreeSoftBoxCount の値を現在のNANDの状態に合わせて更新します。
if (!NAMUT_UpdateSoftBoxCount()) if (!NAMUT_UpdateSoftBoxCount())
{ {
OS_Warning(" Fail! : Update Soft Box Count\n"); kamiFontPrintfConsoleEx(CONSOLE_RED, " Fail! : Update Soft Box Count\n");
} }
} }
else else
{ {
kamiFontPrintfMain( 4, 20, 1, "Import was failed! 0x%x", nam_result); kamiFontPrintfConsoleEx(CONSOLE_RED, " Fail! : NamInport Result Code = 0x%x\n", nam_result);
kamiFontLoadScreenData();
OS_Warning(" Fail! : NAM Result Code = 0x%x\n", nam_result);
return FALSE; return FALSE;
} }
} }
@ -183,7 +198,7 @@ BOOL kamiImportTad(NAMTitleId* pTitleID)
// セーブファイルパス取得 // セーブファイルパス取得
if ( NAM_GetTitleSaveFilePath(savePublicPath, savePrivatePath, tadInfo.titleInfo.titleId) != NAM_OK ) if ( NAM_GetTitleSaveFilePath(savePublicPath, savePrivatePath, tadInfo.titleInfo.titleId) != NAM_OK )
{ {
OS_Warning(" Fail! NAM_GetTitleSaveFilePath\n"); kamiFontPrintfConsoleEx(CONSOLE_RED, " Fail! NAM_GetTitleSaveFilePath\n");
} }
else else
{ {
@ -192,7 +207,7 @@ BOOL kamiImportTad(NAMTitleId* pTitleID)
{ {
if (NAMUTi_ClearSavedataPublic(savePublicPath, tadInfo.titleInfo.titleId) == FALSE) if (NAMUTi_ClearSavedataPublic(savePublicPath, tadInfo.titleInfo.titleId) == FALSE)
{ {
OS_Warning(" Fail! NAMUTi_ClearSavedataPublic\n"); kamiFontPrintfConsoleEx(CONSOLE_RED, " Fail! NAMUTi_ClearSavedataPublic\n");
} }
} }
@ -201,7 +216,7 @@ BOOL kamiImportTad(NAMTitleId* pTitleID)
{ {
if (NAMUTi_ClearSavedataPrivate(savePrivatePath, tadInfo.titleInfo.titleId) == FALSE) if (NAMUTi_ClearSavedataPrivate(savePrivatePath, tadInfo.titleInfo.titleId) == FALSE)
{ {
OS_Warning(" Fail! NAMUTi_ClearSavedataPrivate\n"); kamiFontPrintfConsoleEx(CONSOLE_RED, " Fail! NAMUTi_ClearSavedataPrivate\n");
} }
} }
} }
@ -213,14 +228,14 @@ BOOL kamiImportTad(NAMTitleId* pTitleID)
// サブバナーパス取得 // サブバナーパス取得
if ( NAM_GetTitleBannerFilePath(subBannerPath, tadInfo.titleInfo.titleId) != NAM_OK ) if ( NAM_GetTitleBannerFilePath(subBannerPath, tadInfo.titleInfo.titleId) != NAM_OK )
{ {
OS_Warning(" Fail! NAM_GetTitleBannerFilePath\n"); kamiFontPrintfConsoleEx(CONSOLE_RED, " Fail! NAM_GetTitleBannerFilePath\n");
} }
else else
{ {
// サブバナー破壊 // サブバナー破壊
if (NAMUTi_DestroySubBanner(subBannerPath) == FALSE) if (NAMUTi_DestroySubBanner(subBannerPath) == FALSE)
{ {
OS_Warning(" Fail! NAMUTi_DestroySubBanner\n"); kamiFontPrintfConsoleEx(CONSOLE_RED, " Fail! NAMUTi_DestroySubBanner\n");
} }
} }
} }

View File

@ -326,7 +326,7 @@ kamiFontPrintfConsole(u8 color, const char *text, ...)
else else
{ {
// 一文字ずつ書き込み // 一文字ずつ書き込み
sFontScreenDataMain[((sYPos * 32) + sXPos) % (24 * 32)] = sFontScreenDataSub[((sYPos * 32) + sXPos) % (24 * 32)] =
(u16)((color << SCREEN_DATA_COLOR_PLTT_SHIFT) | temp[i]); (u16)((color << SCREEN_DATA_COLOR_PLTT_SHIFT) | temp[i]);
// X座標が右端に到達した場合は改行処理 // X座標が右端に到達した場合は改行処理

View File

@ -158,7 +158,10 @@ TwlMain()
} }
// アプリジャンプに成功したならここへは到達しない // アプリジャンプに成功したならここへは到達しない
while(1){}; while(1)
{
kamiFontLoadScreenData();
};
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*