mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
写真帳とDSiサウンドの追加に対応。 データを2重持ちしないようにdataフォルダの構成を変更。合わせてreadmeも修正。 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2671 b08762b0-b915-fc4b-9d8c-17b2551a87ff
354 lines
9.8 KiB
C
354 lines
9.8 KiB
C
/*---------------------------------------------------------------------------*
|
||
Project: SystemUpdater
|
||
File: process_import.c
|
||
|
||
Copyright 2008 Nintendo. All rights reserved.
|
||
|
||
These coded instructions, statements, and computer programs contain
|
||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||
Company Ltd., and are protected by Federal copyright law. They may
|
||
not be disclosed to third parties or copied or duplicated in any form,
|
||
in whole or in part, without the prior written consent of Nintendo.
|
||
|
||
$Date:: $
|
||
$Rev$
|
||
$Author$
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
#include <twl.h>
|
||
#include <nitro/snd.h>
|
||
#include <twl/fatfs.h>
|
||
#include <nitro/card.h>
|
||
#include <twl/nam.h>
|
||
#include <twl/lcfg.h>
|
||
#include <sysmenu/namut.h>
|
||
#include "kami_font.h"
|
||
#include "hw_info.h"
|
||
#include "TWLHWInfo_api.h"
|
||
#include "graphics.h"
|
||
#include "kami_global.h"
|
||
#include "font.h"
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Œ^’è‹`
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
’è<E28099>”’è‹`
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
#define THREAD_STACK_SIZE (16*1024)
|
||
|
||
static const char* sDirectoryNameRegion[] =
|
||
{
|
||
"japan",
|
||
"america",
|
||
"europe",
|
||
"australia"
|
||
};
|
||
|
||
static const char* sDirectoryNameConsole[] =
|
||
{
|
||
"debugger", // IS_TWL_DEBUGGER
|
||
"standalone", // IS_TWL_CAPTURE
|
||
"standalone", // TWL
|
||
"" // UNKNOWN
|
||
};
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
“à•”•Ï<E280A2>”’è‹`
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
static u32 sCurrentProgress;
|
||
static vu8 sNowImport = FALSE;
|
||
static vu8 sProgress = FALSE;
|
||
static u8 sStack[THREAD_STACK_SIZE];
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
“à•”ŠÖ<C5A0>”<EFBFBD>錾
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
static s32 kamiImportTad(const char* path, BOOL erase);
|
||
static void ProgressThread(void* arg);
|
||
static void Destructor(void* arg);
|
||
void ProgressDraw(f32 ratio);
|
||
BOOL ImportDirectoryTad(char* directory);
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
<20>ˆ—<CB86>ŠÖ<C5A0>”’è‹`
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: ProcessImport
|
||
|
||
Description:
|
||
|
||
Arguments: ‚È‚µ<E2809A>B
|
||
|
||
Returns: ‚È‚µ<E2809A>B
|
||
*---------------------------------------------------------------------------*/
|
||
BOOL ProcessImport(void)
|
||
{
|
||
const s32 MAX_RETRY_COUNT = 2;
|
||
BOOL result = TRUE;
|
||
char directory[FS_ENTRY_LONGNAME_MAX+6];
|
||
s32 i=0;
|
||
s32 j=0;
|
||
|
||
OS_WaitVBlankIntr();
|
||
NNS_G2dCharCanvasClearArea(&gCanvas, TXT_COLOR_WHITE, 0, 30, 256, 100);
|
||
OS_WaitVBlankIntr();
|
||
NNS_G2dCharCanvasClearArea(&gCanvas2, TXT_COLOR_BLACK, 0, 130, 256, 62);
|
||
OS_WaitVBlankIntr();
|
||
NNS_G2dTextCanvasDrawText(&gTextCanvas, 40, 60,
|
||
TXT_COLOR_WHITE_BASE, TXT_DRAWTEXT_FLAG_DEFAULT, (const char*)L"Now Import..");
|
||
|
||
while(!FadeInTick())
|
||
{
|
||
G3X_Reset();
|
||
G3_Identity();
|
||
G3_PolygonAttr(GX_LIGHTMASK_NONE, GX_POLYGONMODE_DECAL, GX_CULL_NONE, 0, 31, 0);
|
||
G3_SwapBuffers(GX_SORTMODE_AUTO, GX_BUFFERMODE_W);
|
||
OS_WaitVBlankIntr();
|
||
}
|
||
|
||
STD_TSNPrintf(directory, sizeof(directory), "rom:/data/%s/%s/", sDirectoryNameConsole[GetConsole()], sDirectoryNameRegion[gRegion]);
|
||
result &= ImportDirectoryTad(directory);
|
||
|
||
STD_TSNPrintf(directory, sizeof(directory), "rom:/data/common/%s/", sDirectoryNameRegion[gRegion]);
|
||
result &= ImportDirectoryTad(directory);
|
||
|
||
STD_TSNPrintf(directory, sizeof(directory), "rom:/data/common/");
|
||
result &= ImportDirectoryTad(directory);
|
||
|
||
while (!FadeOutTick())
|
||
{
|
||
OS_WaitVBlankIntr();
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: ImportDirectoryTad
|
||
|
||
Description: Žw’肵‚½ƒfƒBƒŒƒNƒgƒŠ‚É‚ ‚éTAD‚ð–³<E28093>ðŒ<C3B0>‚ÉImport‚µ‚Ü‚·<E2809A>B
|
||
|
||
Arguments: path
|
||
|
||
Returns: ‚È‚µ<E2809A>B
|
||
*---------------------------------------------------------------------------*/
|
||
BOOL ImportDirectoryTad(char* directory)
|
||
{
|
||
FSFile dir;
|
||
FSDirectoryEntryInfo info[1];
|
||
const s32 MAX_RETRY_COUNT = 2;
|
||
BOOL result = TRUE;
|
||
char full_path[FS_ENTRY_LONGNAME_MAX+6];
|
||
static s32 listNo=0;
|
||
s32 j=0;
|
||
|
||
FS_InitFile(&dir);
|
||
if (!FS_OpenDirectory(&dir, directory, FS_FILEMODE_R))
|
||
{
|
||
kamiFontPrintfConsole(CONSOLE_RED, "Error FS_OpenDirectory()\n");
|
||
return FALSE;
|
||
}
|
||
|
||
// tadƒtƒ@ƒCƒ‹‚ðŒŸ<C592>õ‚µ‚ăCƒ“ƒ|<7C>[ƒg
|
||
while (FS_ReadDirectory(&dir, info))
|
||
{
|
||
s32 nam_result;
|
||
char string1[256];
|
||
u16 string2[256];
|
||
|
||
MI_CpuClear8(string2, sizeof(string2));
|
||
|
||
if ((info->attributes & (FS_ATTRIBUTE_DOS_DIRECTORY | FS_ATTRIBUTE_IS_DIRECTORY)) == 0)
|
||
{
|
||
char* pExtension;
|
||
|
||
// Šg’£Žq‚̃`ƒFƒbƒN
|
||
pExtension = STD_SearchCharReverse( info->longname, '.');
|
||
if (pExtension)
|
||
{
|
||
if (!STD_CompareString( pExtension, ".tad") || !STD_CompareString( pExtension, ".TAD") )
|
||
{
|
||
|
||
STD_TSPrintf(string1, "List %d ", ++listNo);
|
||
STD_ConvertStringSjisToUnicode(string2, NULL, string1, NULL, NULL);
|
||
|
||
NNS_G2dCharCanvasClearArea(&gCanvas, TXT_COLOR_WHITE, 0, 60, 256, 20);
|
||
NNS_G2dTextCanvasDrawText(&gTextCanvas, 40, 60,
|
||
TXT_COLOR_WHITE_BASE, TXT_DRAWTEXT_FLAG_DEFAULT, (const char*)L"Now Import..");
|
||
NNS_G2dTextCanvasDrawText(&gTextCanvas, 135, 60,
|
||
TXT_COLOR_WHITE_BASE, TXT_DRAWTEXT_FLAG_DEFAULT, (const char*)string2);
|
||
|
||
STD_TSNPrintf(full_path, sizeof(full_path), "%s/%s", directory, info->longname);
|
||
// kamiFontPrintfConsole(CONSOLE_GREEN, " %s\n", full_path);
|
||
|
||
// MAX_RETRY_COUNT‚Ü‚ÅƒŠƒgƒ‰ƒC‚·‚é
|
||
for (j=0; j<MAX_RETRY_COUNT; j++)
|
||
{
|
||
nam_result = kamiImportTad(full_path, j);
|
||
if (nam_result == NAM_OK)
|
||
{
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
kamiFontPrintfConsole(CONSOLE_GREEN, "Import %d Retry!\n", listNo);
|
||
}
|
||
}
|
||
|
||
if ( nam_result == NAM_OK)
|
||
{
|
||
kamiFontPrintfConsole(FONT_COLOR_GREEN, "List : %d Import Success.\n", listNo);
|
||
}
|
||
else
|
||
{
|
||
kamiFontPrintfConsole(FONT_COLOR_RED, "Error: %d : RetCode = %d\n", listNo, nam_result );
|
||
result = FALSE;
|
||
}
|
||
|
||
kamiFontLoadScreenData();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: kamiImportTad
|
||
|
||
Description: .tad ƒtƒ@ƒCƒ‹ƒCƒ“ƒ|<7C>[ƒg
|
||
|
||
Arguments: no
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
static s32 kamiImportTad(const char* path, BOOL erase)
|
||
{
|
||
NAMTadInfo tadInfo;
|
||
OSThread thread;
|
||
s32 nam_result;
|
||
|
||
// tadƒtƒ@ƒCƒ‹‚Ì<E2809A>î•ñŽæ“¾
|
||
nam_result = NAM_ReadTadInfo(&tadInfo, path);
|
||
if ( nam_result != NAM_OK )
|
||
{
|
||
return nam_result;
|
||
}
|
||
|
||
// ES‚ÌŽd—l‚Ō¢ e-ticket ‚ª‚ ‚邯<E2809A>V‚µ‚¢ e-ticket ‚ðŽg‚Á‚½ƒCƒ“ƒ|<7C>[ƒg‚ª‚Å‚«‚È‚¢
|
||
// Žb’è‘Ήž‚Æ‚µ‚ÄŠY“–ƒ^ƒCƒgƒ‹‚ðŠ®‘S<E28098>í<EFBFBD>œ‚µ‚Ä‚©‚çƒCƒ“ƒ|<7C>[ƒg‚·‚é
|
||
if (erase)
|
||
{
|
||
nam_result = NAM_DeleteTitleCompletely(tadInfo.titleInfo.titleId);
|
||
if ( nam_result != NAM_OK )
|
||
{
|
||
kamiFontPrintfConsole(CONSOLE_RED, "Fail! RetCode=%x\n", nam_result);
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
// ƒCƒ“ƒ|<7C>[ƒgŠJŽnƒtƒ‰ƒO‚ð—§‚Ä‚é
|
||
sNowImport = TRUE;
|
||
|
||
// <20>i’»ƒXƒŒƒbƒh<C692>ì<EFBFBD>¬
|
||
MI_CpuClear8(sStack, THREAD_STACK_SIZE);
|
||
OS_CreateThread(&thread, ProgressThread, NULL,
|
||
(void*)((u32)sStack + THREAD_STACK_SIZE), THREAD_STACK_SIZE, OS_GetCurrentThread()->priority - 1);
|
||
OS_WakeupThreadDirect(&thread);
|
||
|
||
// ImportŠJŽn
|
||
nam_result = NAM_ImportTad( path );
|
||
|
||
// ƒCƒ“ƒ|<7C>[ƒgŠJŽnƒtƒ‰ƒO‚ð‰º‚°‚é
|
||
sNowImport = FALSE;
|
||
|
||
// <20>i’»ƒXƒŒƒbƒh‚ÌŽ©—Í<E28094>I—¹‚ð‘Ò‚Â
|
||
while (sProgress){};
|
||
|
||
// ‚«‚¿‚ñ‚Æ•\ަ‚·‚é
|
||
G3_SwapBuffers(GX_SORTMODE_AUTO, GX_BUFFERMODE_W);
|
||
OS_WaitVBlankIntr();
|
||
|
||
// InstalledSoftBoxCount, FreeSoftBoxCount ‚Ì’l‚ðŒ»<C592>Ý‚ÌNAND‚Ì<E2809A>ó‘Ô‚É<E2809A>‡‚킹‚Ä<E2809A>X<EFBFBD>V‚µ‚Ü‚·<E2809A>B
|
||
(void)NAMUT_UpdateSoftBoxCount();
|
||
|
||
return nam_result;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: ProgressThread
|
||
|
||
Description: .tad ƒtƒ@ƒCƒ‹ƒCƒ“ƒ|<7C>[ƒg‚Ì<E2809A>i’»‚ð•\ަ‚·‚éƒXƒŒƒbƒh<C692>B
|
||
<09>i’»‚ª100%‚É’B‚·‚邯<E2809A>ˆ—<CB86>‚𔲂¯‚é<E2809A>B
|
||
|
||
Arguments: arg - Žg—p‚µ‚È‚¢<E2809A>B
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
static void ProgressThread(void* /*arg*/)
|
||
{
|
||
u32 currentSize;
|
||
u32 totalSize = 0;
|
||
u32 totalSizeBk = 0;
|
||
|
||
sProgress = TRUE;
|
||
|
||
while (sNowImport)
|
||
{
|
||
NAM_GetProgress(¤tSize, &totalSize);
|
||
|
||
if ((totalSize > 0 && totalSize == currentSize) || totalSizeBk > totalSize)
|
||
{
|
||
// Šù‚ɃCƒ“ƒ|<7C>[ƒg‚ª<E2809A>I—¹
|
||
ProgressDraw((f32)1.0);
|
||
break;
|
||
}
|
||
else if (totalSize > 0)
|
||
{
|
||
ProgressDraw((f32)currentSize/totalSize);
|
||
}
|
||
|
||
totalSizeBk = totalSize;
|
||
|
||
// Vƒuƒ‰ƒ“ƒN‘Ò‚¿
|
||
G3_SwapBuffers(GX_SORTMODE_AUTO, GX_BUFFERMODE_W);
|
||
OS_WaitVBlankIntr();
|
||
|
||
// 3D<33>‰Šú‰»
|
||
G3X_Reset();
|
||
G3_Identity();
|
||
G3_PolygonAttr(GX_LIGHTMASK_NONE, GX_POLYGONMODE_DECAL, GX_CULL_NONE, 0, 31, 0);
|
||
}
|
||
|
||
sProgress = FALSE;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: ProgressDraw
|
||
|
||
Description: ƒCƒ“ƒ|<7C>[ƒg‚Ì<E2809A>i’»‚ð•\ަ‚µ‚Ü‚·
|
||
|
||
Arguments:
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
void ProgressDraw(f32 ratio)
|
||
{
|
||
s16 x = (s16)(30 + (226 - 30)*ratio);
|
||
|
||
// ƒOƒŠ<C692>[ƒ“ƒo<C692>[
|
||
DrawQuadWithColors( 30, 86, x, 95, GX_RGB(22, 31, 22), GX_RGB(12, 25, 12));
|
||
|
||
// ƒOƒŒ<C692>[ƒo<C692>[
|
||
DrawQuad( 30, 86, 226, 95, GX_RGB(28, 28, 28));
|
||
}
|