- cleaned up cover and banner download coding.

This commit is contained in:
Fledge68 2018-12-12 18:03:33 -06:00
parent b44c415602
commit 43e2dd50e4
6 changed files with 719 additions and 832 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 MiB

After

Width:  |  Height:  |  Size: 3.3 MiB

View File

@ -1050,8 +1050,7 @@ private:
}; };
void _game(bool launch = false); void _game(bool launch = false);
void _downloadUrl(const char *url, u8 **dl_file, u32 *dl_size); void _downloadUrl(const char *url, u8 **dl_file, u32 *dl_size);
void _download(string gameId = string()); void _download(string gameId = string(), int dl_type = 0);
void _downloadBnr(const char *gameID);
bool _code(char code[4], bool erase = false); bool _code(char code[4], bool erase = false);
void _about(bool help = false); void _about(bool help = false);
bool _wbfsOp(WBFS_OP op); bool _wbfsOp(WBFS_OP op);
@ -1153,10 +1152,10 @@ private:
// //
void _setThrdMsg(const wstringEx &msg, float progress); void _setThrdMsg(const wstringEx &msg, float progress);
void _setDumpMsg(const wstringEx &msg, float progress, float fileprog); void _setDumpMsg(const wstringEx &msg, float progress, float fileprog);
int _coverDownloader();
void _downloadProgress(void *obj, int size, int position); void _downloadProgress(void *obj, int size, int position);
int _coverDownloader();
int _gametdbDownloaderAsync(); int _gametdbDownloaderAsync();
int _downloadBnrAll(); int _bannerDownloader();
static s32 _networkComplete(s32 result, void *usrData); static s32 _networkComplete(s32 result, void *usrData);
void _initAsyncNetwork(); void _initAsyncNetwork();
@ -1189,7 +1188,6 @@ private:
void _listEmuNands(const char *path, vector<string> &emuNands); void _listEmuNands(const char *path, vector<string> &emuNands);
int _downloadCheatFileAsync(); int _downloadCheatFileAsync();
int _downloadBannerAsync();
static void * _downloadUrlAsync(void *obj); static void * _downloadUrlAsync(void *obj);
void _playGameSound(void); void _playGameSound(void);

View File

@ -78,7 +78,7 @@ void CMenu::_CoverBanner(void)
if(m_btnMgr.selected(m_coverbnrBtnDlCover)) if(m_btnMgr.selected(m_coverbnrBtnDlCover))
{ {
_hideCoverBanner(); _hideCoverBanner();
_download(id); _download(id, 1);
_showCoverBanner(); _showCoverBanner();
} }
else if(m_btnMgr.selected(m_coverbnrBtnDeleteCover)) else if(m_btnMgr.selected(m_coverbnrBtnDeleteCover))
@ -95,7 +95,7 @@ void CMenu::_CoverBanner(void)
fsop_deleteFile(fmt("%s/%s.bnr", m_customBnrDir.c_str(), id)); fsop_deleteFile(fmt("%s/%s.bnr", m_customBnrDir.c_str(), id));
fsop_deleteFile(fmt("%s/%.3s.bnr", m_bnrCacheDir.c_str(), id)); fsop_deleteFile(fmt("%s/%.3s.bnr", m_bnrCacheDir.c_str(), id));
fsop_deleteFile(fmt("%s/%.3s.bnr", m_customBnrDir.c_str(), id)); fsop_deleteFile(fmt("%s/%.3s.bnr", m_customBnrDir.c_str(), id));
_downloadBnr(id); _download(id, 2);
m_newGame = true; m_newGame = true;
_showCoverBanner(); _showCoverBanner();
} }

View File

@ -31,7 +31,7 @@ static const char FMT_CPIC_URL[] = "http://art.gametdb.com/{console}/cover2/{loc
static block download = { 0, 0 }; static block download = { 0, 0 };
static bool settingsmenu = false; static bool settingsmenu = false;
static string m_coverDLGameId; static string dl_gameID;
void CMenu::_hideSettings(bool instant) void CMenu::_hideSettings(bool instant)
{ {
@ -227,9 +227,9 @@ void CMenu::_showDownload(void)
int count, countFlat; int count, countFlat;
u32 n; u32 n;
void CMenu::_download(string gameId) void CMenu::_download(string gameId, int dl_type)
{ {
m_coverDLGameId = gameId; dl_gameID = gameId;
bool dl_finished = false; bool dl_finished = false;
SetupInput(); SetupInput();
_showDownload(); _showDownload();
@ -251,7 +251,7 @@ void CMenu::_download(string gameId)
m_btnMgr.hide(m_wbfsPBar); m_btnMgr.hide(m_wbfsPBar);
m_btnMgr.hide(m_wbfsLblMessage); m_btnMgr.hide(m_wbfsLblMessage);
m_btnMgr.hide(m_wbfsLblDialog); m_btnMgr.hide(m_wbfsLblDialog);
if(strlen(m_coverDLGameId.c_str()) > 0) if(strlen(dl_gameID.c_str()) > 0)
break; break;
_showDownload(); _showDownload();
} }
@ -262,9 +262,9 @@ void CMenu::_download(string gameId)
m_btnMgr.up(); m_btnMgr.up();
else if(BTN_DOWN_PRESSED) else if(BTN_DOWN_PRESSED)
m_btnMgr.down(); m_btnMgr.down();
if(BTN_A_PRESSED || !gameId.empty()) if(BTN_A_PRESSED || dl_type > 0)
{ {
if(m_btnMgr.selected(m_downloadBtnAll) || !gameId.empty()) if(m_btnMgr.selected(m_downloadBtnAll) || dl_type == 1)
{ {
m_refreshGameList = true;// not needed instead just initcf() m_refreshGameList = true;// not needed instead just initcf()
@ -308,11 +308,11 @@ void CMenu::_download(string gameId)
else if(ret == -3) else if(ret == -3)
m_btnMgr.setText(m_wbfsLblDialog, _t("dlmsg30", L"No covers missing.")); m_btnMgr.setText(m_wbfsLblDialog, _t("dlmsg30", L"No covers missing."));
dl_finished = true; dl_finished = true;
gameId.clear(); dl_type = 0;
//maybe show back button //maybe show back button
//m_btnMgr.show(m_downloadBtnBack); //m_btnMgr.show(m_downloadBtnBack);
} }
if(m_btnMgr.selected(m_downloadBtnBanners))// || !gameId.empty()) if(m_btnMgr.selected(m_downloadBtnBanners) || dl_type == 2)
{ {
//m_refreshGameList = true; //m_refreshGameList = true;
@ -334,13 +334,18 @@ void CMenu::_download(string gameId)
m_btnMgr.show(m_wbfsLblDialog); m_btnMgr.show(m_wbfsLblDialog);
_start_pThread(); _start_pThread();
int ret = _downloadBnrAll(); int ret = _bannerDownloader();
_stop_pThread(); _stop_pThread();
if(ret == 0) if(ret == 0)
{
if(dl_gameID.empty())
{ {
m_thrdMessage = wfmt(_fmt("dlmsg5", L"%i/%i files downloaded."), count, n); m_thrdMessage = wfmt(_fmt("dlmsg5", L"%i/%i files downloaded."), count, n);
m_btnMgr.setText(m_wbfsLblDialog, m_thrdMessage); m_btnMgr.setText(m_wbfsLblDialog, m_thrdMessage);
} }
else
m_btnMgr.setText(m_wbfsLblDialog, _t("dlmsg14", L"Done."));
}
else if(ret == -1) else if(ret == -1)
m_btnMgr.setText(m_wbfsLblDialog, _t("dlmsg34", L"Banner URL not set properly!"));//banner url not set m_btnMgr.setText(m_wbfsLblDialog, _t("dlmsg34", L"Banner URL not set properly!"));//banner url not set
else if(ret == -2) else if(ret == -2)
@ -348,7 +353,7 @@ void CMenu::_download(string gameId)
else if(ret == -3) else if(ret == -3)
m_btnMgr.setText(m_wbfsLblDialog, _t("dlmsg33", L"No banners missing."));// no banners missing m_btnMgr.setText(m_wbfsLblDialog, _t("dlmsg33", L"No banners missing."));// no banners missing
dl_finished = true; dl_finished = true;
gameId.clear(); dl_type = 0;
//maybe show back button //maybe show back button
//m_btnMgr.show(m_downloadBtnBack); //m_btnMgr.show(m_downloadBtnBack);
} }
@ -883,41 +888,6 @@ static string makeURL(const string format, const string gameId, const string cou
return url; return url;
} }
/*
static bool checkPNGBuf(u8 *data)
{
if(data == NULL)
return false;
PNGUPROP imgProp;
IMGCTX ctx = PNGU_SelectImageFromBuffer(data);
if (ctx == NULL)
return false;
int ret = PNGU_GetImageProperties(ctx, &imgProp);
PNGU_ReleaseImageContext(ctx);
return ret == PNGU_OK;
}
static bool checkPNGFile(const char *filename)
{
u32 fileSize = 0;
u8 *buffer = fsop_ReadFile(filename, &fileSize);
bool ret = false;
if(buffer != NULL)
{
ret = checkPNGBuf(buffer);
MEM2_free(buffer);
}
return ret;
}
*/
void CMenu::_setThrdMsg(const wstringEx &msg, float progress)
{
if (m_thrdStop) return;
if (msg != L"...") m_thrdMessage = msg;
m_thrdMessageAdded = true;
m_thrdProgress = progress;
}
void CMenu::_downloadProgress(void *obj, int size, int position) void CMenu::_downloadProgress(void *obj, int size, int position)
{ {
@ -932,6 +902,79 @@ void CMenu::_downloadProgress(void *obj, int size, int position)
} }
} }
void * CMenu::_pThread(void *obj)
{
CMenu *m = (CMenu*)obj;
m->SetupInput();
while(m->m_thrdInstalling)
{
m->_mainLoopCommon();
if(m->m_thrdUpdated)
{
m->m_thrdUpdated = false;
m->_downloadProgress(obj, m->m_thrdTotal, m->m_thrdWritten);
if(m->m_thrdProgress > 0.f)
{
m_btnMgr.setText(m->m_wbfsLblMessage, wfmt(L"%i%%", (int)(m->m_thrdProgress * 100.f)));
m_btnMgr.setProgress(m->m_wbfsPBar, m->m_thrdProgress);
}
m->m_thrdDone = true;
}
if(m->m_thrdMessageAdded)
{
m->m_thrdMessageAdded = false;
if(!m->m_thrdMessage.empty())
m_btnMgr.setText(m->m_wbfsLblDialog, m->m_thrdMessage);
}
}
m->m_thrdWorking = false;
return 0;
}
void CMenu::_start_pThread(void)
{
m_thrdPtr = LWP_THREAD_NULL;
m_thrdWorking = true;
m_thrdMessageAdded = false;
m_thrdInstalling = true;
m_thrdUpdated = false;
m_thrdDone = true;
m_thrdProgress = 0.f;
m_thrdWritten = 0;
m_thrdTotal = 0;
LWP_CreateThread(&m_thrdPtr, _pThread, this, 0, 8 * 1024, 64);
}
void CMenu::_stop_pThread(void)
{
if(m_thrdPtr == LWP_THREAD_NULL)
return;
if(LWP_ThreadIsSuspended(m_thrdPtr))
LWP_ResumeThread(m_thrdPtr);
m_thrdInstalling = false;
while(m_thrdWorking)
usleep(50);
LWP_JoinThread(m_thrdPtr, NULL);
m_thrdPtr = LWP_THREAD_NULL;
m_btnMgr.setProgress(m_wbfsPBar, 1.f);
m_btnMgr.setText(m_wbfsLblMessage, L"100%");
}
void CMenu::update_pThread(u64 amount, bool add)
{
if(m_thrdDone)
{
m_thrdDone = false;
if(add)
m_thrdWritten += amount;
else
m_thrdWritten = amount;
m_thrdUpdated = true;
}
}
int CMenu::_coverDownloader() int CMenu::_coverDownloader()
{ {
count = 0; count = 0;
@ -952,7 +995,7 @@ int CMenu::_coverDownloader()
vector<string> coverIDList; vector<string> coverIDList;
/* create list of cover ID's that need downloading */ /* create list of cover ID's that need downloading */
if(m_coverDLGameId.empty()) if(dl_gameID.empty())
{ {
for(u32 i = 0; i < m_gameList.size(); ++i) for(u32 i = 0; i < m_gameList.size(); ++i)
{ {
@ -963,7 +1006,7 @@ int CMenu::_coverDownloader()
} }
} }
else else
coverIDList.push_back(m_coverDLGameId); coverIDList.push_back(dl_gameID);
n = coverIDList.size(); n = coverIDList.size();
m_thrdTotal = n * 3;// 3 = download cover, save png, and make wfc m_thrdTotal = n * 3;// 3 = download cover, save png, and make wfc
@ -977,8 +1020,6 @@ int CMenu::_coverDownloader()
} }
/* initialize network connection */ /* initialize network connection */
if(m_thrdTotal > 0)
{
m_thrdMessage = _t("dlmsg1", L"Initializing network..."); m_thrdMessage = _t("dlmsg1", L"Initializing network...");
m_thrdMessageAdded = true; m_thrdMessageAdded = true;
if(_initNetwork() < 0) if(_initNetwork() < 0)
@ -1570,7 +1611,6 @@ int CMenu::_coverDownloader()
if(!success) if(!success)
update_pThread(3); update_pThread(3);
} }
}
/* cover list done and downloading complete */ /* cover list done and downloading complete */
if(c_gameTDB.IsLoaded()) if(c_gameTDB.IsLoaded())
c_gameTDB.CloseFile(); c_gameTDB.CloseFile();
@ -1660,108 +1700,13 @@ int CMenu::_gametdbDownloaderAsync()
/*********************************************************************************/ /*********************************************************************************/
/*********************************************************************************/ /*********************************************************************************/
const char *banner_url = NULL; int CMenu::_bannerDownloader()
const char *banner_url_id3 = NULL;
char *banner_location = NULL;
int CMenu::_downloadBannerAsync()
{
m_thrdTotal = 2;// download and save
m_thrdMessage = _t("dlmsg1", L"Initializing network...");
m_thrdMessageAdded = true;
if(_initNetwork() < 0)
{
return -2;
}
m_thrdMessage = _t("cfgbnr7", L"Downloading banner...");
m_thrdMessageAdded = true;
download = downloadfile(banner_url);
if(download.data == NULL || download.size < 0x5000)
download = downloadfile(banner_url_id3);
/* minimum 50kb */
if(download.data != NULL && download.size > 51200 && download.data[0] != '<')
{
update_pThread(1);// its downloaded
if(banner_location != NULL)
fsop_WriteFile(banner_location, download.data, download.size);
update_pThread(1);// its saved
if(download.data != NULL)
free(download.data);
return 0;
}
if(download.data != NULL)
free(download.data);
return -3;// download failed
}
static const char *GAME_BNR_ID = "{gameid}";
void CMenu::_downloadBnr(const char *gameID)
{
if(gameID == NULL || strlen(gameID) > 6)
return;
string base_url = m_cfg.getString("GENERAL", "custom_banner_url", CUSTOM_BANNER_URL);
if(base_url.size() < 3 || base_url.find(GAME_BNR_ID) == string::npos)
return;
base_url.replace(base_url.find(GAME_BNR_ID), strlen(GAME_BNR_ID), gameID);
banner_url = base_url.c_str();
string base_url_id3 = m_cfg.getString("GENERAL", "custom_banner_url", CUSTOM_BANNER_URL);
base_url_id3.replace(base_url_id3.find(GAME_BNR_ID), strlen(GAME_BNR_ID), gameID, 3);
banner_url_id3 = base_url_id3.c_str();
banner_location = fmt_malloc("%s/%s.bnr", m_customBnrDir.c_str(), gameID);
if(banner_location == NULL)
return;
bool dl_finished = false;
while(!m_exit)
{
_mainLoopCommon();
if((BTN_HOME_PRESSED || BTN_B_PRESSED) && dl_finished)
{
m_btnMgr.hide(m_wbfsPBar);
m_btnMgr.hide(m_wbfsLblMessage);
m_btnMgr.hide(m_wbfsLblDialog);
break;
}
if(!dl_finished)
{
m_btnMgr.setProgress(m_wbfsPBar, 0.f, true);
m_btnMgr.setText(m_wbfsLblMessage, L"0%");
m_btnMgr.setText(m_wbfsLblDialog, L"");
m_btnMgr.show(m_wbfsPBar);
m_btnMgr.show(m_wbfsLblMessage);
m_btnMgr.show(m_wbfsLblDialog);
_start_pThread();
int ret = _downloadBannerAsync();
_stop_pThread();
if(ret == -1)
m_btnMgr.setText(m_wbfsLblDialog, _t("dlmsg27", L"Not enough memory!"));
else if(ret == -2)
m_btnMgr.setText(m_wbfsLblDialog, _t("dlmsg2", L"Network initialization failed!"));
else if(ret == -3)
m_btnMgr.setText(m_wbfsLblDialog, _t("dlmsg12", L"Download failed!"));
else
m_btnMgr.setText(m_wbfsLblDialog, _t("dlmsg14", L"Done."));
dl_finished = true;
}
}
if(banner_location != NULL)
{
MEM2_free(banner_location);
banner_location = NULL;
}
}
int CMenu::_downloadBnrAll()
{ {
vector<string> BnrIDList; vector<string> BnrIDList;
count = 0; count = 0;
if(dl_gameID.empty())
{
currentPartition = m_cfg.getInt(GC_DOMAIN, "partition", USB1); currentPartition = m_cfg.getInt(GC_DOMAIN, "partition", USB1);
string gameDir(fmt(gc_games_dir, DeviceName[currentPartition])); string gameDir(fmt(gc_games_dir, DeviceName[currentPartition]));
string cacheDir(fmt("%s/%s_gamecube.db", m_listCacheDir.c_str(), DeviceName[currentPartition])); string cacheDir(fmt("%s/%s_gamecube.db", m_listCacheDir.c_str(), DeviceName[currentPartition]));
@ -1773,6 +1718,9 @@ int CMenu::_downloadBnrAll()
BnrIDList.push_back(m_cacheList[i].id); BnrIDList.push_back(m_cacheList[i].id);
} }
m_cacheList.clear(); m_cacheList.clear();
}
else
BnrIDList.push_back(dl_gameID);
n = BnrIDList.size(); n = BnrIDList.size();
m_thrdTotal = n; m_thrdTotal = n;
@ -1783,6 +1731,16 @@ int CMenu::_downloadBnrAll()
return -3; return -3;
} }
const char *banner_url = NULL;
const char *banner_url_id3 = NULL;
const char *GAME_BNR_ID = "{gameid}";
string base_url = m_cfg.getString("GENERAL", "custom_banner_url", CUSTOM_BANNER_URL);
if(base_url.size() < 3 || base_url.find(GAME_BNR_ID) == string::npos)
{
BnrIDList.clear();
return -1;
}
m_thrdMessage = _t("dlmsg1", L"Initializing network..."); m_thrdMessage = _t("dlmsg1", L"Initializing network...");
m_thrdMessageAdded = true; m_thrdMessageAdded = true;
if(_initNetwork() < 0) if(_initNetwork() < 0)
@ -1791,13 +1749,6 @@ int CMenu::_downloadBnrAll()
return -2; return -2;
} }
string base_url = m_cfg.getString("GENERAL", "custom_banner_url", CUSTOM_BANNER_URL);
if(base_url.size() < 3 || base_url.find(GAME_BNR_ID) == string::npos)
{
BnrIDList.clear();
return -1;
}
for(u32 i = 0; i < BnrIDList.size(); ++i) for(u32 i = 0; i < BnrIDList.size(); ++i)
{ {
string base_url_id6 = base_url; string base_url_id6 = base_url;
@ -1808,7 +1759,10 @@ int CMenu::_downloadBnrAll()
base_url_id3.replace(base_url_id3.find(GAME_BNR_ID), strlen(GAME_BNR_ID), BnrIDList[i].c_str(), 3); base_url_id3.replace(base_url_id3.find(GAME_BNR_ID), strlen(GAME_BNR_ID), BnrIDList[i].c_str(), 3);
banner_url_id3 = base_url_id3.c_str(); banner_url_id3 = base_url_id3.c_str();
if(dl_gameID.empty())
m_thrdMessage = wfmt(_fmt("dlmsg3", L"Downloading banner %i/%i"), i + 1, n); m_thrdMessage = wfmt(_fmt("dlmsg3", L"Downloading banner %i/%i"), i + 1, n);
else
m_thrdMessage = _t("cfgbnr7", L"Downloading banner...");
m_thrdMessageAdded = true; m_thrdMessageAdded = true;
download = downloadfile(banner_url); download = downloadfile(banner_url);

View File

@ -342,79 +342,6 @@ int getTID(const char *path, u64 *tid)
return 0; return 0;
} }
void * CMenu::_pThread(void *obj)
{
CMenu *m = (CMenu*)obj;
m->SetupInput();
while(m->m_thrdInstalling)
{
m->_mainLoopCommon();
if(m->m_thrdUpdated)
{
m->m_thrdUpdated = false;
m->_downloadProgress(obj, m->m_thrdTotal, m->m_thrdWritten);
if(m->m_thrdProgress > 0.f)
{
m_btnMgr.setText(m->m_wbfsLblMessage, wfmt(L"%i%%", (int)(m->m_thrdProgress * 100.f)));
m_btnMgr.setProgress(m->m_wbfsPBar, m->m_thrdProgress);
}
m->m_thrdDone = true;
}
if(m->m_thrdMessageAdded)
{
m->m_thrdMessageAdded = false;
if(!m->m_thrdMessage.empty())
m_btnMgr.setText(m->m_wbfsLblDialog, m->m_thrdMessage);
}
}
m->m_thrdWorking = false;
return 0;
}
void CMenu::_start_pThread(void)
{
m_thrdPtr = LWP_THREAD_NULL;
m_thrdWorking = true;
m_thrdMessageAdded = false;
m_thrdInstalling = true;
m_thrdUpdated = false;
m_thrdDone = true;
m_thrdProgress = 0.f;
m_thrdWritten = 0;
m_thrdTotal = 0;
LWP_CreateThread(&m_thrdPtr, _pThread, this, 0, 8 * 1024, 64);
}
void CMenu::_stop_pThread(void)
{
if(m_thrdPtr == LWP_THREAD_NULL)
return;
if(LWP_ThreadIsSuspended(m_thrdPtr))
LWP_ResumeThread(m_thrdPtr);
m_thrdInstalling = false;
while(m_thrdWorking)
usleep(50);
LWP_JoinThread(m_thrdPtr, NULL);
m_thrdPtr = LWP_THREAD_NULL;
m_btnMgr.setProgress(m_wbfsPBar, 1.f);
m_btnMgr.setText(m_wbfsLblMessage, L"100%");
}
void CMenu::update_pThread(u64 amount, bool add)
{
if(m_thrdDone)
{
m_thrdDone = false;
if(add)
m_thrdWritten += amount;
else
m_thrdWritten = amount;
m_thrdUpdated = true;
}
}
/* only installs channel wads to emunand and mios wads to real nand */ /* only installs channel wads to emunand and mios wads to real nand */
/* several places gecko prints are used but no error msg to the user is displayed */ /* several places gecko prints are used but no error msg to the user is displayed */
void CMenu::_Wad(const char *wad_path) void CMenu::_Wad(const char *wad_path)

View File

@ -68,6 +68,14 @@ void CMenu::_addDiscProgress(int status, int total, void *user_data)
} }
} }
void CMenu::_setThrdMsg(const wstringEx &msg, float progress)
{
if (m_thrdStop) return;
if (msg != L"...") m_thrdMessage = msg;
m_thrdMessageAdded = true;
m_thrdProgress = progress;
}
bool CMenu::_searchGamesByID(const char *gameId) bool CMenu::_searchGamesByID(const char *gameId)
{ {
for(vector<dir_discHdr>::iterator itr = m_gameList.begin(); itr != m_gameList.end(); ++itr) for(vector<dir_discHdr>::iterator itr = m_gameList.begin(); itr != m_gameList.end(); ++itr)