From 0fc21f82a3715cdbe0ee2121c5a15158d0281765 Mon Sep 17 00:00:00 2001 From: "fix94.1" Date: Sun, 13 May 2012 15:13:33 +0000 Subject: [PATCH] -big code cleanup, removed all those SAFE_ and SMART_ thingys and replaced it with their proper calls -fixed some big memory bugs, downloading much covers shouldn't be a problem anymore, also memory management should work better -fixed typo in debug print on game boot, also changed some things in apploader, making it ready to remove linker script properly, still in but I hope not for long ;) -modified wiiflow startup and init order a bit --- source/channel/MD5.c | 7 +- source/channel/banner.cpp | 5 +- source/channel/channel_launcher.c | 18 +-- source/channel/channels.cpp | 15 +- source/channel/nand.cpp | 169 ++++++++++---------- source/gc/fileOps.c | 22 +-- source/gecko/gecko.c | 8 +- source/gecko/wifi_gecko.c | 2 +- source/gui/FreeTypeGX.cpp | 212 +++++++++++++------------ source/gui/coverflow.cpp | 26 ++-- source/gui/gcvid.cpp | 4 +- source/gui/pngu.c | 28 ++-- source/gui/text.cpp | 10 +- source/gui/texture.cpp | 8 +- source/gui/video.cpp | 7 +- source/homebrew/homebrew.cpp | 4 +- source/list/list.cpp | 4 +- source/loader/apploader.c | 29 ++-- source/loader/cios.cpp | 10 +- source/loader/disc.c | 13 +- source/loader/fs.c | 2 +- source/loader/fst.c | 2 +- source/loader/gc_disc.cpp | 6 +- source/loader/utils.h | 6 - source/loader/wbfs.c | 2 +- source/loader/wbfs_ext.c | 4 +- source/loader/wip.c | 6 +- source/main.cpp | 50 +++--- source/memory/mem2.cpp | 4 - source/memory/smartptr.hpp | 6 +- source/menu/menu.cpp | 98 +++++++----- source/menu/menu_about.cpp | 25 ++- source/menu/menu_cheat.cpp | 11 +- source/menu/menu_download.cpp | 246 ++++++++++++++---------------- source/menu/menu_game.cpp | 20 +-- source/menu/menu_main.cpp | 15 +- 36 files changed, 568 insertions(+), 536 deletions(-) diff --git a/source/channel/MD5.c b/source/channel/MD5.c index 95aee2c3..f88c0d30 100644 --- a/source/channel/MD5.c +++ b/source/channel/MD5.c @@ -84,7 +84,6 @@ #include #include "MD5.h" -#include "utils.h" #include "mem2.hpp" /* -------------------------------------------------------------------------- ** @@ -572,7 +571,7 @@ unsigned char * MD5fromFile(unsigned char *dst, const char *src) if(!!buffer) { //no memory - SAFE_CLOSE(file); + fclose(file); return NULL; } @@ -583,8 +582,8 @@ unsigned char * MD5fromFile(unsigned char *dst, const char *src) } while(read > 0); - SAFE_CLOSE(file); - SAFE_FREE(buffer); + fclose(file); + MEM2_free(buffer); (void)auth_md5CloseCtx( ctx, dst ); /* Close the context. */ diff --git a/source/channel/banner.cpp b/source/channel/banner.cpp index ece22d36..207038c4 100644 --- a/source/channel/banner.cpp +++ b/source/channel/banner.cpp @@ -36,7 +36,6 @@ #include "banner.h" #include "MD5.h" #include "loader/fs.h" -#include "loader/utils.h" #include "gecko.h" #include "U8Archive.h" @@ -156,7 +155,7 @@ Banner * Banner::GetBanner(u64 title, char *appname, bool isfs, bool imetOnly) buf = ISFS_GetFile((u8 *) appname, &size, imetOnly ? sizeof(IMET) + IMET_OFFSET : 0); if (size == 0) { - SAFE_FREE(buf); + free(buf); return NULL; } } @@ -176,7 +175,7 @@ Banner * Banner::GetBanner(u64 title, char *appname, bool isfs, bool imetOnly) buf = MEM2_alloc(size); fread(buf, size, 1, fp); - SAFE_CLOSE(fp); + fclose(fp); } return new Banner((u8 *)buf, title); diff --git a/source/channel/channel_launcher.c b/source/channel/channel_launcher.c index ae53ef3e..3f20c638 100644 --- a/source/channel/channel_launcher.c +++ b/source/channel/channel_launcher.c @@ -43,7 +43,7 @@ s32 BootChannel(u8 *data, u64 chantitle, u8 vidMode, bool vipatch, bool countryS Identify(chantitle, &ios); entryPoint = LoadChannel(data); - SAFE_FREE(data); + free(data); /* Select an appropriate video mode */ GXRModeObj * vmode = __Disc_SelectVMode(vidMode, chantitle); @@ -243,8 +243,8 @@ bool Identify(u64 titleid, u32 *ios) if (certBuffer == NULL || certSize == 0) { gprintf("Reading certs...Failed!\n"); - SAFE_FREE(tmdBuffer); - SAFE_FREE(tikBuffer); + free(tmdBuffer); + free(tikBuffer); return false; } @@ -271,9 +271,9 @@ bool Identify(u64 titleid, u32 *ios) } } - SAFE_FREE(tmdBuffer); - SAFE_FREE(tikBuffer); - SAFE_FREE(certBuffer); + free(tmdBuffer); + free(tikBuffer); + free(certBuffer); return ret < 0 ? false : true; } @@ -297,14 +297,14 @@ u8 * GetDol(u64 title, u32 bootcontent) if (decompressLZ77content(data, contentSize, &decompressed, &size) < 0) { gprintf("Decompression failed\n"); - SAFE_FREE(data); + free(data); return NULL; } - SAFE_FREE(data); + free(data); data = decompressed; } return data; } gprintf("Failed!\n"); return NULL; -} \ No newline at end of file +} diff --git a/source/channel/channels.cpp b/source/channel/channels.cpp index ba698761..d324acf4 100644 --- a/source/channel/channels.cpp +++ b/source/channel/channels.cpp @@ -36,7 +36,6 @@ #include "banner.h" #include "wstringEx.hpp" #include "gecko.h" -#include "utils.h" #include "fs.h" #include "config.hpp" #include "text.hpp" @@ -97,8 +96,8 @@ u8 Channels::GetRequestedIOS(u64 title) if(size > 0x18B) IOS = titleTMD[0x18B]; - - SAFE_FREE(titleTMD); + + free(titleTMD); return IOS; } @@ -118,14 +117,14 @@ u64* Channels::GetChannelList(u32* count) if(ES_GetTitles(titles, countall) < 0) { - SAFE_FREE(titles); + free(titles); return NULL; } u64* channels = (u64*)MEM2_alloc(countall * sizeof(u64)); if (!channels) { - SAFE_FREE(titles); + free(titles); return NULL; } @@ -143,7 +142,7 @@ u64* Channels::GetChannelList(u32* count) channels[(*count)++] = titles[i]; } } - SAFE_FREE(titles); + free(titles); return (u64*)MEM2_realloc(channels, *count * sizeof(u64)); } @@ -170,7 +169,7 @@ bool Channels::GetAppNameFromTmd(u64 title, char* app, bool dol, u32* bootconten break; } - SAFE_FREE(data); + free(data); return ret; } @@ -246,7 +245,7 @@ void Channels::Search(u32 channelType, string lang) } } - SAFE_FREE(list); + free(list); } wchar_t * Channels::GetName(int index) diff --git a/source/channel/nand.cpp b/source/channel/nand.cpp index 57131a2c..996ea76a 100644 --- a/source/channel/nand.cpp +++ b/source/channel/nand.cpp @@ -35,7 +35,6 @@ #include #include "nand.hpp" -#include "utils.h" #include "mem2.hpp" #include "wbfs.h" #include "gecko.h" @@ -275,30 +274,29 @@ s32 Nand::__configread(void) confbuffer = (u8 *)MEM2_alloc(0x4000); txtbuffer = (char *)MEM2_alloc(0x100); cfg_hdr = (config_header *)NULL; - + FILE *f = fopen(cfgpath, "rb"); if(f) { fread(confbuffer, 1, 0x4000, f); - SAFE_CLOSE(f); + fclose(f); } - + f = fopen(settxtpath, "rb"); if(f) { fread(txtbuffer, 1, 0x100, f); - SAFE_CLOSE(f); + fclose(f); } - cfg_hdr = (config_header *)confbuffer; - + __Dec_Enc_TB(); - + configloaded = configloaded ? false : true; - + if(tbdec && configloaded) return 1; - + return 0; } @@ -307,7 +305,7 @@ s32 Nand::__configwrite(void) if(configloaded) { __Dec_Enc_TB(); - + if(!tbdec) { FILE *f = fopen(cfgpath, "wb"); @@ -315,19 +313,18 @@ s32 Nand::__configwrite(void) { fwrite(confbuffer, 1, 0x4000, f); gprintf("SYSCONF written to:\"%s\"\n", cfgpath); - SAFE_CLOSE(f); + fclose(f); } - + f = fopen(settxtpath, "wb"); if(f) { fwrite(txtbuffer, 1, 0x100, f); gprintf("setting.txt written to: \"%s\"\n", settxtpath); - SAFE_CLOSE(f); + fclose(f); } - configloaded = configloaded ? false : true; - + if(!tbdec && !configloaded) return 1; } @@ -335,7 +332,7 @@ s32 Nand::__configwrite(void) free(confbuffer); free(txtbuffer); return 0; -} +} u32 Nand::__configsetbyte(const char *item, u8 val) { @@ -408,7 +405,7 @@ bool Nand::__FileExists(const char *path, ...) if (f != 0) { gprintf("File \"%s\" exists\n", path); - SAFE_CLOSE(f); + fclose(f); return true; } return false; @@ -488,30 +485,29 @@ s32 Nand::__FlashNandFile(const char *source, const char *dest) gprintf("Error opening source: \"%s\"\n", source); return 0; } - + fseek(file, 0, SEEK_END); u32 fsize = ftell(file); fseek(file, 0, SEEK_SET); - + if(fake) { NandSize += fsize; if(showprogress) dumper(NandSize, 0x1f400000, 0x1f400000, NandSize, FilesDone, FoldersDone, (char *)"", data); - - SAFE_CLOSE(file); + fclose(file); return 0; } - + gprintf("Flashing: %s (%uKB) to nand...", dest, (fsize / 0x400)+1); - + ISFS_Delete(dest); ISFS_CreateFile(dest, 0, 3, 3, 3); s32 fd = ISFS_Open(dest, ISFS_OPEN_RW); if(fd < 0) { gprintf(" failed\nError: ISFS_OPEN(%s, %d) %d\n", dest, ISFS_OPEN_RW, fd); - SAFE_CLOSE(file); + fclose(file); return fd; } @@ -528,24 +524,24 @@ s32 Nand::__FlashNandFile(const char *source, const char *dest) { gprintf(" failed\nError: fread(%p, 1, %d, %s) %d\n", buffer, size, source, ret); ISFS_Close(fd); - SAFE_CLOSE(file); + fclose(file); MEM2_free(buffer); return ret; } - + ret = ISFS_Write(fd, buffer, size); if(ret <= 0) { gprintf(" failed\nError: ISFS_Write(%d, %p, %d) %d\n", fd, buffer, size, ret); ISFS_Close(fd); - SAFE_CLOSE(file); + fclose(file); MEM2_free(buffer); return ret; } toread -= size; NandDone += size; FileDone += size; - + if(showprogress) { const char *file = strrchr(dest, '/')+1; @@ -561,7 +557,7 @@ s32 Nand::__FlashNandFile(const char *source, const char *dest) } ISFS_Close(fd); MEM2_free(buffer); - SAFE_CLOSE(file); + fclose(file); return 1; } @@ -574,7 +570,7 @@ s32 Nand::__DumpNandFile(const char *source, const char *dest) gprintf("Error: IOS_OPEN(%s, %d) %d\n", source, ISFS_OPEN_READ, fd); return fd; } - + fstats *status = (fstats *)MEM2_alloc(sizeof(fstats)); s32 ret = ISFS_GetFileStats(fd, status); if (ret < 0) @@ -584,21 +580,20 @@ s32 Nand::__DumpNandFile(const char *source, const char *dest) MEM2_free(status); return ret; } - + if(fake) { NandSize += status->file_length; if(showprogress) dumper(NandSize, 0x1f400000, 0x1f400000, NandSize, FilesDone, FoldersDone, (char *)"", data); - ISFS_Close(fd); MEM2_free(status); return 0; } - + if(__FileExists(dest)) remove(dest); - + FILE *file = fopen(dest, "wb"); if (!file) { @@ -606,7 +601,7 @@ s32 Nand::__DumpNandFile(const char *source, const char *dest) ISFS_Close(fd); return 0; } - + gprintf("Dumping: %s (%ukb)...", source, (status->file_length / 0x400)+1); u8 *buffer = (u8 *)MEM2_alloc(BLOCK); @@ -622,18 +617,18 @@ s32 Nand::__DumpNandFile(const char *source, const char *dest) { gprintf(" failed\nError: ISFS_Read(%d, %p, %d) %d\n", fd, buffer, size, ret); ISFS_Close(fd); - SAFE_CLOSE(file); + fclose(file); MEM2_free(status); MEM2_free(buffer); return ret; } - + ret = fwrite(buffer, 1, size, file); if(ret < 0) { gprintf(" failed\nError writing to destination: \"%s\" (%d)\n", dest, ret); ISFS_Close(fd); - SAFE_CLOSE(file); + fclose(file); MEM2_free(status); MEM2_free(buffer); return ret; @@ -641,7 +636,7 @@ s32 Nand::__DumpNandFile(const char *source, const char *dest) toread -= size; NandDone += size; FileDone += size; - + if(showprogress) { const char *file = strrchr(source, '/')+1; @@ -655,11 +650,11 @@ s32 Nand::__DumpNandFile(const char *source, const char *dest) dumper(NandDone, NandSize, status->file_length, FileDone, FilesDone, FoldersDone, (char *)file, data); } gprintf(" done!\n"); - SAFE_CLOSE(file); + fclose(file); ISFS_Close(fd); MEM2_free(status); MEM2_free(buffer); - + return 0; } @@ -668,19 +663,19 @@ s32 Nand::__FlashNandFolder(const char *source, const char *dest) { char nsource[MAX_FAT_PATH]; char ndest[ISFS_MAXPATH]; - + DIR *dir_iter; struct dirent *ent; - + dir_iter = opendir(source); if (!dir_iter) return 1; - + while((ent = readdir(dir_iter)) != NULL) { if(ent->d_name[0] == '.') continue; - + if(dest[strlen(dest)-1] == '/') snprintf(ndest, sizeof(ndest), "%s%s", dest, ent->d_name); else @@ -690,7 +685,7 @@ s32 Nand::__FlashNandFolder(const char *source, const char *dest) snprintf(nsource, sizeof(nsource), "%s%s", source, ent->d_name); else snprintf(nsource, sizeof(nsource), "%s/%s", source, ent->d_name); - + if(ent->d_type == DT_DIR) { __NANDify(ndest); @@ -717,16 +712,16 @@ s32 Nand::__DumpNandFolder(const char *source, const char *dest) char nsource[ISFS_MAXPATH]; char ndest[MAX_FAT_PATH]; char tdest[MAX_FAT_PATH]; - + __GetNameList(source, &names, &cnt); - + for(i = 0; i < cnt; i++) { if(source[strlen(source)-1] == '/') snprintf(nsource, sizeof(nsource), "%s%s", source, names[i].name); else snprintf(nsource, sizeof(nsource), "%s/%s", source, names[i].name); - + if(!names[i].type) { __FATify(tdest, nsource); @@ -745,7 +740,7 @@ s32 Nand::__DumpNandFolder(const char *source, const char *dest) __DumpNandFolder(nsource, dest); } } - SAFE_FREE(names); + free(names); return 0; } @@ -758,7 +753,7 @@ void Nand::CreatePath(const char *path, ...) { if(folder[strlen(folder)-1] == '/') folder[strlen(folder)-1] = 0; - + char *check = folder; while (true) { @@ -768,7 +763,7 @@ void Nand::CreatePath(const char *path, ...) else break; } - + DIR *d; d = opendir(folder); @@ -784,7 +779,7 @@ void Nand::CreatePath(const char *path, ...) } } va_end(args); - SAFE_FREE(folder); + free(folder); } void Nand::CreateTitleTMD(const char *path, dir_discHdr *hdr) @@ -799,28 +794,28 @@ void Nand::CreateTitleTMD(const char *path, dir_discHdr *hdr) if(!titleTMD) return; - + u32 highTID = *(u32*)(titleTMD+0x18c); u32 lowTID = *(u32*)(titleTMD+0x190); - + CreatePath("%s/title/%08x/%08x/data", path, highTID, lowTID); CreatePath("%s/title/%08x/%08x/content", path, highTID, lowTID); - + char nandpath[MAX_FAT_PATH]; if(path[strlen(path)-1] == '/') snprintf(nandpath, sizeof(nandpath), "%stitle/%08x/%08x/content/title.tmd", path, highTID, lowTID); else snprintf(nandpath, sizeof(nandpath), "%s/title/%08x/%08x/content/title.tmd", path, highTID, lowTID); - + struct stat filestat; if (stat(nandpath, &filestat) == 0) { - SAFE_FREE(titleTMD); + free(titleTMD); gprintf("%s Exists!\n", nandpath); return; } gprintf("Creating title TMD: %s\n", nandpath); - + FILE *file = fopen(nandpath, "wb"); if(file) { @@ -831,7 +826,7 @@ void Nand::CreateTitleTMD(const char *path, dir_discHdr *hdr) else gprintf("Creating title TMD: %s failed (%i)\n", nandpath, file); - SAFE_FREE(titleTMD); + free(titleTMD); } s32 Nand::FlashToNAND(const char *source, const char *dest, dump_callback_t i_dumper, void *i_data) @@ -884,15 +879,15 @@ s32 Nand::CalcDumpSpace(const char *source, dump_callback_t i_dumper, void *i_da dumper = i_dumper; fake = true; showprogress = true; - + u32 temp = 0; - + s32 ret = ISFS_ReadDir(source, NULL, &temp); if(ret < 0) __DumpNandFile(source, ""); else __DumpNandFolder(source, ""); - + return NandSize; } @@ -913,16 +908,16 @@ s32 Nand::CreateConfig(const char *path) CreatePath("%s/title/00000001", path); CreatePath("%s/title/00000001/00000002", path); CreatePath("%s/title/00000001/00000002/data", path); - + fake = false; showprogress = false; - + bzero(cfgpath, MAX_FAT_PATH+1); bzero(settxtpath, MAX_FAT_PATH+1); - + snprintf(cfgpath, sizeof(cfgpath), "%s%s", path, SYSCONFPATH); snprintf(settxtpath, sizeof(settxtpath), "%s%s", path, TXTPATH); - + __DumpNandFile(SYSCONFPATH, cfgpath); __DumpNandFile(TXTPATH, settxtpath); return 0; @@ -935,61 +930,57 @@ s32 Nand::Do_Region_Change(string id) switch(id[3]) { case 'J': - { - gprintf("Switching region to NTSC-j \n"); + gprintf("Switching region to NTSC-J \n"); CCode[0] = 1; - __configsetbyte( "IPL.LNG", 0 ); + __configsetbyte( "IPL.LNG", 0 ); __configsetbigarray( "SADR.LNG", CCode, 0x1007 ); __configsetsetting( "AREA", "JPN" ); __configsetsetting( "MODEL", "RVL-001(JPN)" ); __configsetsetting( "CODE", "LJM" ); __configsetsetting( "VIDEO", "NTSC" ); - __configsetsetting( "GAME", "JP" ); - } break; + __configsetsetting( "GAME", "JP" ); + break; case 'E': - { - gprintf("Switching region to NTSC-u \n"); + gprintf("Switching region to NTSC-U \n"); CCode[0] = 31; - __configsetbyte( "IPL.LNG", 1 ); + __configsetbyte( "IPL.LNG", 1 ); __configsetbigarray( "IPL.SADR", CCode, 0x1007 ); __configsetsetting( "AREA", "USA" ); __configsetsetting( "MODEL", "RVL-001(USA)" ); __configsetsetting( "CODE", "LU" ); __configsetsetting( "VIDEO", "NTSC" ); - __configsetsetting( "GAME", "US" ); - } break; + __configsetsetting( "GAME", "US" ); + break; case 'D': case 'F': case 'I': case 'M': case 'P': case 'S': - case 'U': - { + case 'U': gprintf("Switching region to PAL \n"); CCode[0] = 110; - __configsetbyte( "IPL.LNG", 1 ); + __configsetbyte( "IPL.LNG", 1 ); __configsetbigarray( "IPL.SADR", CCode, 0x1007 ); __configsetsetting( "AREA", "EUR" ); __configsetsetting( "MODEL", "RVL-001(EUR)" ); __configsetsetting( "CODE", "LEH" ); __configsetsetting( "VIDEO", "PAL" ); - __configsetsetting( "GAME", "EU" ); - } break; - case 'K': - { - gprintf("Switching region to NTSC-k \n"); + __configsetsetting( "GAME", "EU" ); + break; + case 'K': + gprintf("Switching region to NTSC-K \n"); CCode[0] = 137; - __configsetbyte( "IPL.LNG", 9 ); + __configsetbyte( "IPL.LNG", 9 ); __configsetbigarray( "IPL.SADR", CCode, 0x1007 ); __configsetsetting( "AREA", "KOR" ); __configsetsetting( "MODEL", "RVL-001(KOR)" ); __configsetsetting( "CODE", "LKM" ); __configsetsetting( "VIDEO", "NTSC" ); __configsetsetting( "GAME", "KR" ); - } break; + break; } } __configwrite(); return 1; -} \ No newline at end of file +} diff --git a/source/gc/fileOps.c b/source/gc/fileOps.c index 9ed9f337..e7474747 100644 --- a/source/gc/fileOps.c +++ b/source/gc/fileOps.c @@ -36,23 +36,25 @@ static s32 stopThread; static u64 folderSize = 0; // return false if the file doesn't exist -bool fsop_GetFileSizeBytes (char *path, size_t *filesize) // for me stats st_size report always 0 :( +bool fsop_GetFileSizeBytes(char *path, size_t *filesize) // for me stats st_size report always 0 :( { FILE *f; size_t size = 0; f = fopen(path, "rb"); - if (!f) + if(!f) { - if (filesize) *filesize = size; + if(filesize) + *filesize = size; return false; } //Get file size fseek( f, 0, SEEK_END); size = ftell(f); - if (filesize) *filesize = size; - SAFE_CLOSE(f); + if(filesize) + *filesize = size; + fclose(f); return true; } @@ -176,7 +178,7 @@ bool fsop_CopyFile (char *source, char *target, progress_callback_t spinner, voi ft = fopen(target, "wt"); if (!ft) { - SAFE_CLOSE(fs); + fclose(fs); return false; } @@ -186,8 +188,8 @@ bool fsop_CopyFile (char *source, char *target, progress_callback_t spinner, voi if (size == 0) { - SAFE_CLOSE(fs); - SAFE_CLOSE(ft); + fclose(fs); + fclose(ft); return true; } @@ -246,8 +248,8 @@ bool fsop_CopyFile (char *source, char *target, progress_callback_t spinner, voi stopThread = 1; DCFlushRange(&stopThread, sizeof(stopThread)); - SAFE_CLOSE(fs); - SAFE_CLOSE(ft); + fclose(fs); + fclose(ft); MEM2_free(buff); if (err) diff --git a/source/gecko/gecko.c b/source/gecko/gecko.c index cc6b13b8..9cd0b07a 100644 --- a/source/gecko/gecko.c +++ b/source/gecko/gecko.c @@ -10,6 +10,7 @@ #include #include +#include "mem2.hpp" #include "wifi_gecko.h" /* init-globals */ @@ -78,7 +79,7 @@ void WriteToFile(char* tmp) { if(tmpfilebuffer != NULL) { - SAFE_FREE(tmpfilebuffer); + MEM2_free(tmpfilebuffer); tmpfilebuffer = NULL; } return; @@ -111,7 +112,7 @@ void gprintf( const char *format, ... ) } va_end(va); - SAFE_FREE(tmp); + free(tmp); } char ascii(char s) @@ -161,7 +162,8 @@ bool InitGecko() USBGeckoOutput(); - tmpfilebuffer = (char*)calloc(filebuffer + 1, sizeof(char)); + tmpfilebuffer = (char*)MEM2_alloc(filebuffer + 1 * sizeof(char)); + memset(tmpfilebuffer, 0, sizeof(tmpfilebuffer)); #ifdef sd_write_log WriteToSD = true; diff --git a/source/gecko/wifi_gecko.c b/source/gecko/wifi_gecko.c index 570c309e..5803523e 100644 --- a/source/gecko/wifi_gecko.c +++ b/source/gecko/wifi_gecko.c @@ -145,5 +145,5 @@ void wifi_printf(const char * format, ...) } va_end(va); - SAFE_FREE(tmp); + free(tmp); } diff --git a/source/gui/FreeTypeGX.cpp b/source/gui/FreeTypeGX.cpp index 28409b68..7ddb818f 100644 --- a/source/gui/FreeTypeGX.cpp +++ b/source/gui/FreeTypeGX.cpp @@ -31,7 +31,8 @@ * @param textureFormat Optional format (GX_TF_*) of the texture as defined by the libogc gx.h header file. If not specified default value is GX_TF_RGBA8. * @param positionFormat Optional positional format (GX_POS_*) of the texture as defined by the libogc gx.h header file. If not specified default value is GX_POS_XYZ. */ -FreeTypeGX::FreeTypeGX(uint8_t textureFormat, uint8_t positionFormat) { +FreeTypeGX::FreeTypeGX(uint8_t textureFormat, uint8_t positionFormat) +{ FT_Init_FreeType(&this->ftLibrary); this->textureFormat = textureFormat; @@ -43,7 +44,8 @@ FreeTypeGX::FreeTypeGX(uint8_t textureFormat, uint8_t positionFormat) { /** * Default destructor for the FreeTypeGX class. */ -FreeTypeGX::~FreeTypeGX() { +FreeTypeGX::~FreeTypeGX() +{ this->unloadFont(); if (this->ftLibrary != 0) { @@ -61,7 +63,8 @@ FreeTypeGX::~FreeTypeGX() { * @param strChar Character string to be converted. * @return Wide character representation of supplied character string. */ -wchar_t* FreeTypeGX::charToWideChar(char* strChar) { +wchar_t* FreeTypeGX::charToWideChar(char* strChar) +{ wchar_t *strWChar; strWChar = new wchar_t[strlen(strChar) + 1]; @@ -82,7 +85,8 @@ wchar_t* FreeTypeGX::charToWideChar(char* strChar) { * @param pointSize The desired point size this wrapper's configured font face. * @param cacheAll Optional flag to specify if all font characters should be cached when the class object is created. If specified as false the characters only become cached the first time they are used. If not specified default value is false. */ -uint16_t FreeTypeGX::loadFont(uint8_t* fontBuffer, FT_Long bufferSize, FT_UInt pointSize, FT_Pos weight, uint32_t index, bool cacheAll) { +uint16_t FreeTypeGX::loadFont(uint8_t* fontBuffer, FT_Long bufferSize, FT_UInt pointSize, FT_Pos weight, uint32_t index, bool cacheAll) +{ this->unloadFont(); this->ftPointSize = pointSize != 0 ? pointSize : this->ftPointSize; this->ftWeight = weight; @@ -114,7 +118,8 @@ uint16_t FreeTypeGX::loadFont(uint8_t* fontBuffer, FT_Long bufferSize, FT_UInt p * * \overload */ -uint16_t FreeTypeGX::loadFont(const uint8_t* fontBuffer, FT_Long bufferSize, FT_UInt pointSize, FT_Pos weight, uint32_t index, bool cacheAll) { +uint16_t FreeTypeGX::loadFont(const uint8_t* fontBuffer, FT_Long bufferSize, FT_UInt pointSize, FT_Pos weight, uint32_t index, bool cacheAll) +{ return this->loadFont((uint8_t *)fontBuffer, bufferSize, pointSize, weight, index, cacheAll); } @@ -123,11 +128,17 @@ uint16_t FreeTypeGX::loadFont(const uint8_t* fontBuffer, FT_Long bufferSize, FT_ * * This routine clears all members of the font map structure and frees all allocated memory back to the system. */ -void FreeTypeGX::unloadFont() { - for( std::map::iterator i = this->fontData.begin(); i != this->fontData.end(); i++) { - SAFE_FREE(i->second.glyphDataTexture); +void FreeTypeGX::unloadFont() +{ + for( std::map::iterator i = this->fontData.begin(); i != this->fontData.end(); i++) + { + if(i->second.glyphDataTexture != NULL) + { + MEM2_free(i->second.glyphDataTexture); + i->second.glyphDataTexture = NULL; + } } - + this->fontData.clear(); if (this->ftFace != NULL) { @@ -145,7 +156,8 @@ void FreeTypeGX::unloadFont() { * @param textureFormat The texture format to which the data is to be converted. * @return The correctly adjusted texture width. */ -uint16_t FreeTypeGX::adjustTextureWidth(uint16_t textureWidth, uint8_t textureFormat) { +uint16_t FreeTypeGX::adjustTextureWidth(uint16_t textureWidth, uint8_t textureFormat) +{ uint16_t alignment; switch(textureFormat) { @@ -176,7 +188,8 @@ uint16_t FreeTypeGX::adjustTextureWidth(uint16_t textureWidth, uint8_t textureFo * @param textureFormat The texture format to which the data is to be converted. * @return The correctly adjusted texture height. */ -uint16_t FreeTypeGX::adjustTextureHeight(uint16_t textureHeight, uint8_t textureFormat) { +uint16_t FreeTypeGX::adjustTextureHeight(uint16_t textureHeight, uint8_t textureFormat) +{ uint16_t alignment; switch(textureFormat) { @@ -207,22 +220,26 @@ uint16_t FreeTypeGX::adjustTextureHeight(uint16_t textureHeight, uint8_t texture * @param charCode The requested glyph's character code. * @return A pointer to the allocated font structure. */ -ftgxCharData *FreeTypeGX::cacheGlyphData(wchar_t charCode) { +ftgxCharData *FreeTypeGX::cacheGlyphData(wchar_t charCode) +{ FT_UInt gIndex; uint16_t textureWidth = 0, textureHeight = 0; gIndex = FT_Get_Char_Index( this->ftFace, charCode ); - if (!FT_Load_Glyph(this->ftFace, gIndex, FT_LOAD_DEFAULT )) { + if (!FT_Load_Glyph(this->ftFace, gIndex, FT_LOAD_DEFAULT )) + { FT_Render_Glyph( this->ftSlot, FT_RENDER_MODE_NORMAL ); - - if(this->ftSlot->format == FT_GLYPH_FORMAT_BITMAP) { + + if(this->ftSlot->format == FT_GLYPH_FORMAT_BITMAP) + { FT_Bitmap *glyphBitmap = &this->ftSlot->bitmap; FT_Bitmap_Embolden(this->ftLibrary, glyphBitmap, this->ftWeight, this->ftWeight); - + textureWidth = adjustTextureWidth(glyphBitmap->width, this->textureFormat); textureHeight = adjustTextureHeight(glyphBitmap->rows, this->textureFormat); - this->fontData[charCode] = (ftgxCharData){ + this->fontData[charCode] = (ftgxCharData) + { this->ftSlot->advance.x >> 6, gIndex, textureWidth, @@ -233,7 +250,7 @@ ftgxCharData *FreeTypeGX::cacheGlyphData(wchar_t charCode) { NULL }; this->loadGlyphData(glyphBitmap, &this->fontData[charCode]); - + return &this->fontData[charCode]; } } @@ -247,15 +264,15 @@ ftgxCharData *FreeTypeGX::cacheGlyphData(wchar_t charCode) { * This routine locates each character in the configured font face and renders the glyph's bitmap. * Each bitmap and relevant information is loaded into its own quickly addressible structure within an instance-specific map. */ -uint16_t FreeTypeGX::cacheGlyphDataComplete() { +uint16_t FreeTypeGX::cacheGlyphDataComplete() +{ uint16_t i = 0; FT_UInt gIndex; FT_ULong charCode = FT_Get_First_Char( this->ftFace, &gIndex ); - while ( gIndex != 0 ) { - - if(this->cacheGlyphData(charCode) != NULL) { + while( gIndex != 0 ) + { + if(this->cacheGlyphData(charCode) != NULL) i++; - } charCode = FT_Get_Next_Char( this->ftFace, charCode, &gIndex ); } @@ -310,18 +327,14 @@ void FreeTypeGX::loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData) * @param width Current pixel width of the string. * @param format Positional format of the string. */ -uint16_t FreeTypeGX::getStyleOffsetWidth(uint16_t width, uint16_t format) { - - if (format & FTGX_JUSTIFY_LEFT ) { +uint16_t FreeTypeGX::getStyleOffsetWidth(uint16_t width, uint16_t format) +{ + if (format & FTGX_JUSTIFY_LEFT ) return 0; - } - else if (format & FTGX_JUSTIFY_CENTER ) { + else if (format & FTGX_JUSTIFY_CENTER ) return width >> 1; - } - else if (format & FTGX_JUSTIFY_RIGHT ) { + else if (format & FTGX_JUSTIFY_RIGHT ) return width; - } - return 0; } @@ -333,17 +346,14 @@ uint16_t FreeTypeGX::getStyleOffsetWidth(uint16_t width, uint16_t format) { * @param offset Current pixel offset data of the string. * @param format Positional format of the string. */ -uint16_t FreeTypeGX::getStyleOffsetHeight(ftgxDataOffset offset, uint16_t format) { - if (format & FTGX_ALIGN_TOP ) { +uint16_t FreeTypeGX::getStyleOffsetHeight(ftgxDataOffset offset, uint16_t format) +{ + if (format & FTGX_ALIGN_TOP ) return -offset.max; - } - else if (format & FTGX_ALIGN_MIDDLE ) { + else if (format & FTGX_ALIGN_MIDDLE ) return -(offset.max - offset.min) >> 1; - } - else if (format & FTGX_ALIGN_BOTTOM ) { + else if (format & FTGX_ALIGN_BOTTOM ) return offset.min; - } - return 0; } @@ -360,35 +370,34 @@ uint16_t FreeTypeGX::getStyleOffsetHeight(ftgxDataOffset offset, uint16_t format * @param textStyle Flags which specify any styling which should be applied to the rendered string. * @return The number of characters printed. */ -uint16_t FreeTypeGX::drawText(uint16_t x, uint16_t y, wchar_t *text, GXColor color, uint16_t textStyle) { +uint16_t FreeTypeGX::drawText(uint16_t x, uint16_t y, wchar_t *text, GXColor color, uint16_t textStyle) +{ uint16_t strLength = wcslen(text); uint16_t x_pos = x, printed = 0; uint16_t x_offset = 0, y_offset = 0; GXTexObj glyphTexture; FT_Vector pairDelta; - if(textStyle & 0x000F) { + if(textStyle & 0x000F) x_offset = this->getStyleOffsetWidth(this->getWidth(text), textStyle); - } - if(textStyle & 0x00F0) { + if(textStyle & 0x00F0) y_offset = this->getStyleOffsetHeight(this->getOffset(text), textStyle); - } - + GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR); - - for (uint16_t i = 0; i < strLength; i++) { - + + for (uint16_t i = 0; i < strLength; i++) + { ftgxCharData* glyphData = NULL; - if( this->fontData.find(text[i]) != this->fontData.end() ) { + if( this->fontData.find(text[i]) != this->fontData.end() ) glyphData = &this->fontData[text[i]]; - } - else { + else glyphData = this->cacheGlyphData(text[i]); - } - - if(glyphData != NULL) { + + if(glyphData != NULL) + { - if(this->ftKerningEnabled && i) { + if(this->ftKerningEnabled && i) + { FT_Get_Kerning( this->ftFace, this->fontData[text[i - 1]].glyphIndex, glyphData->glyphIndex, FT_KERNING_DEFAULT, &pairDelta ); x_pos += pairDelta.x >> 6; } @@ -401,9 +410,8 @@ uint16_t FreeTypeGX::drawText(uint16_t x, uint16_t y, wchar_t *text, GXColor col } } - if(textStyle & 0x0F00) { + if(textStyle & 0x0F00) this->drawTextFeature(x - x_offset, y, this->getWidth(text), this->getOffset(text), textStyle, color); - } return printed; } @@ -411,15 +419,19 @@ uint16_t FreeTypeGX::drawText(uint16_t x, uint16_t y, wchar_t *text, GXColor col /** * \overload */ -uint16_t FreeTypeGX::drawText(uint16_t x, uint16_t y, wchar_t const *text, GXColor color, uint16_t textStyle) { +uint16_t FreeTypeGX::drawText(uint16_t x, uint16_t y, wchar_t const *text, GXColor color, uint16_t textStyle) +{ return this->drawText(x, y, (wchar_t *)text, color, textStyle); } -void FreeTypeGX::drawTextFeature(uint16_t x, uint16_t y, uint16_t width, ftgxDataOffset offsetData, uint16_t format, GXColor color) { +void FreeTypeGX::drawTextFeature(uint16_t x, uint16_t y, uint16_t width, ftgxDataOffset offsetData, uint16_t format, GXColor color) +{ uint16_t featureHeight = this->ftPointSize >> 4 > 0 ? this->ftPointSize >> 4 : 1; - if (format & FTGX_STYLE_UNDERLINE ) { - switch(format & 0x00F0) { + if (format & FTGX_STYLE_UNDERLINE ) + { + switch(format & 0x00F0) + { case FTGX_ALIGN_TOP: this->copyFeatureToFramebuffer(this->positionFormat, width, featureHeight, x, y + offsetData.max + 1, color); break; @@ -435,8 +447,10 @@ void FreeTypeGX::drawTextFeature(uint16_t x, uint16_t y, uint16_t width, ftgxDa } } - if (format & FTGX_STYLE_STRIKE ) { - switch(format & 0x00F0) { + if (format & FTGX_STYLE_STRIKE ) + { + switch(format & 0x00F0) + { case FTGX_ALIGN_TOP: this->copyFeatureToFramebuffer(this->positionFormat, width, featureHeight, x, y + ((offsetData.max + offsetData.min) >> 1), color); break; @@ -462,23 +476,23 @@ void FreeTypeGX::drawTextFeature(uint16_t x, uint16_t y, uint16_t width, ftgxDa * @param text NULL terminated string to calculate. * @return The width of the text string in pixels. */ -uint16_t FreeTypeGX::getWidth(wchar_t *text) { +uint16_t FreeTypeGX::getWidth(wchar_t *text) +{ uint16_t strLength = wcslen(text); uint16_t strWidth = 0; FT_Vector pairDelta; - for (uint16_t i = 0; i < strLength; i++) { - + for (uint16_t i = 0; i < strLength; i++) + { ftgxCharData* glyphData = NULL; - if( this->fontData.find(text[i]) != this->fontData.end() ) { + if( this->fontData.find(text[i]) != this->fontData.end() ) glyphData = &this->fontData[text[i]]; - } - else { + else glyphData = this->cacheGlyphData(text[i]); - } - - if(glyphData != NULL) { - if(this->ftKerningEnabled && (i > 0)) { + if(glyphData != NULL) + { + if(this->ftKerningEnabled && (i > 0)) + { FT_Get_Kerning( this->ftFace, this->fontData[text[i - 1]].glyphIndex, glyphData->glyphIndex, FT_KERNING_DEFAULT, &pairDelta ); strWidth += pairDelta.x >> 6; } @@ -486,7 +500,7 @@ uint16_t FreeTypeGX::getWidth(wchar_t *text) { strWidth += glyphData->glyphAdvanceX; } } - + return strWidth; } @@ -494,7 +508,8 @@ uint16_t FreeTypeGX::getWidth(wchar_t *text) { * * \overload */ -uint16_t FreeTypeGX::getWidth(wchar_t const *text) { +uint16_t FreeTypeGX::getWidth(wchar_t const *text) +{ return this->getWidth((wchar_t *)text); } @@ -507,9 +522,9 @@ uint16_t FreeTypeGX::getWidth(wchar_t const *text) { * @param text NULL terminated string to calculate. * @return The height of the text string in pixels. */ -uint16_t FreeTypeGX::getHeight(wchar_t *text) { +uint16_t FreeTypeGX::getHeight(wchar_t *text) +{ ftgxDataOffset offset = this->getOffset(text); - return offset.max + offset.min; } @@ -517,7 +532,8 @@ uint16_t FreeTypeGX::getHeight(wchar_t *text) { * * \overload */ -uint16_t FreeTypeGX::getHeight(wchar_t const *text) { +uint16_t FreeTypeGX::getHeight(wchar_t const *text) +{ return this->getHeight((wchar_t *)text); } @@ -530,26 +546,25 @@ uint16_t FreeTypeGX::getHeight(wchar_t const *text) { * @param text NULL terminated string to calculate. * @return The max and min values above and below the font origin line. */ -ftgxDataOffset FreeTypeGX::getOffset(wchar_t *text) { +ftgxDataOffset FreeTypeGX::getOffset(wchar_t *text) +{ uint16_t strLength = wcslen(text); uint16_t strMax = 0, strMin = 0; - for (uint16_t i = 0; i < strLength; i++) { - + for (uint16_t i = 0; i < strLength; i++) + { ftgxCharData* glyphData = NULL; - if( this->fontData.find(text[i]) != this->fontData.end() ) { + if( this->fontData.find(text[i]) != this->fontData.end() ) glyphData = &this->fontData[text[i]]; - } - else { + else glyphData = this->cacheGlyphData(text[i]); - } - - if(glyphData != NULL) { + + if(glyphData != NULL) + { strMax = glyphData->renderOffsetMax > strMax ? glyphData->renderOffsetMax : strMax; strMin = glyphData->renderOffsetMin > strMin ? glyphData->renderOffsetMin : strMin; } } - return (ftgxDataOffset){strMax, strMin}; } @@ -557,7 +572,8 @@ ftgxDataOffset FreeTypeGX::getOffset(wchar_t *text) { * * \overload */ -ftgxDataOffset FreeTypeGX::getOffset(wchar_t const *text) { +ftgxDataOffset FreeTypeGX::getOffset(wchar_t const *text) +{ return this->getOffset(text); } @@ -574,8 +590,8 @@ ftgxDataOffset FreeTypeGX::getOffset(wchar_t const *text) { * @param screenY The screen Y coordinate at which to output the rendered texture. * @param color Color to apply to the texture. */ -void FreeTypeGX::copyTextureToFramebuffer(GXTexObj *texObj, uint8_t positionFormat, uint16_t texWidth, uint16_t texHeight, int16_t screenX, int16_t screenY, GXColor color) { - +void FreeTypeGX::copyTextureToFramebuffer(GXTexObj *texObj, uint8_t positionFormat, uint16_t texWidth, uint16_t texHeight, int16_t screenX, int16_t screenY, GXColor color) +{ f32 f32TexWidth = texWidth, f32TexHeight = texHeight; float x = (float)screenX + xPos; float y = (float)screenY + yPos; @@ -584,9 +600,10 @@ void FreeTypeGX::copyTextureToFramebuffer(GXTexObj *texObj, uint8_t positionForm // GX_SetTevOp (GX_TEVSTAGE0, GX_MODULATE); // GX_SetVtxDesc (GX_VA_TEX0, GX_DIRECT); - + GX_Begin(GX_QUADS, GX_VTXFMT0, 4); - switch(positionFormat) { + switch(positionFormat) + { case GX_POS_XY: GX_Position2f32(x * xScale, y * yScale); GX_Color4u8(color.r, color.g, color.b, color.a); @@ -626,7 +643,6 @@ void FreeTypeGX::copyTextureToFramebuffer(GXTexObj *texObj, uint8_t positionForm break; } GX_End(); - // GX_SetTevOp (GX_TEVSTAGE0, GX_PASSCLR); // GX_SetVtxDesc (GX_VA_TEX0, GX_NONE); } @@ -643,11 +659,13 @@ void FreeTypeGX::copyTextureToFramebuffer(GXTexObj *texObj, uint8_t positionForm * @param screenY The screen Y coordinate at which to output the quad. * @param color Color to apply to the texture. */ -void FreeTypeGX::copyFeatureToFramebuffer(uint8_t positionFormat, uint16_t featureWidth, uint16_t featureHeight, int16_t screenX, int16_t screenY, GXColor color) { +void FreeTypeGX::copyFeatureToFramebuffer(uint8_t positionFormat, uint16_t featureWidth, uint16_t featureHeight, int16_t screenX, int16_t screenY, GXColor color) +{ f32 f32FeatureWidth = featureWidth, f32FeatureHeight = featureHeight; GX_Begin(GX_QUADS, GX_VTXFMT0, 4); - switch(positionFormat) { + switch(positionFormat) + { case GX_POS_XY: GX_Position2f32(screenX, screenY); GX_Color4u8(color.r, color.g, color.b, color.a); diff --git a/source/gui/coverflow.cpp b/source/gui/coverflow.cpp index 0a1a00ae..4a841ef6 100644 --- a/source/gui/coverflow.cpp +++ b/source/gui/coverflow.cpp @@ -251,10 +251,11 @@ CCoverFlow::~CCoverFlow(void) { clear(); /* for(u8 i = 0; i < 4; i++) */ - SMART_FREE(m_sound[0]); - SMART_FREE(m_hoverSound); - SMART_FREE(m_selectSound); - SMART_FREE(m_cancelSound); + if(m_sound[0].get()) + m_sound[0].release(); + m_hoverSound.release(); + m_selectSound.release(); + m_cancelSound.release(); LWP_MutexDestroy(m_mutex); } @@ -550,7 +551,8 @@ void CCoverFlow::setBlur(u32 blurResolution, u32 blurRadius, float blurFactor) u32 i = min(max(0u, blurResolution), sizeof blurRes / sizeof blurRes[0] - 1u); m_effectTex.width = blurRes[i].x; m_effectTex.height = blurRes[i].y; - SMART_FREE(m_effectTex.data); + if(m_effectTex.data.get()) + m_effectTex.data.release(); m_blurRadius = min(max(1u, blurRadius), 3u); m_blurFactor = min(max(1.f, blurFactor), 2.f); } @@ -617,7 +619,8 @@ void CCoverFlow::stopCoverLoader(bool empty) { for (u32 i = 0; i < m_items.size(); ++i) { - SMART_FREE(m_items[i].texture.data); + if(m_items[i].texture.data.get()) + m_items[i].texture.data.release(); m_items[i].state = CCoverFlow::STATE_Loading; } } @@ -2497,7 +2500,7 @@ bool CCoverFlow::preCacheCover(const char *id, const u8 *png, bool full) SWFCHeader header(tex, full, m_compressCache); fwrite(&header, 1, sizeof header, file); fwrite(zBuffer.get(), 1, zBufferSize, file); - SAFE_CLOSE(file); + fclose(file); } } @@ -2516,7 +2519,7 @@ bool CCoverFlow::fullCoverCached(const char *id) && header.full != 0 && m_compressTextures == (header.cmpr != 0) && header.getWidth() >= 8 && header.getHeight() >= 8 && header.getWidth() <= 1090 && header.getHeight() <= 1090; - SAFE_CLOSE(file); + fclose(file); } return found; } @@ -2553,7 +2556,7 @@ bool CCoverFlow::_loadCoverTexPNG(u32 i, bool box, bool hq) SWFCHeader header(tex, box, m_compressCache); fwrite(&header, 1, sizeof header, file); fwrite(zBuffer.get(), 1, zBufferSize, file); - SAFE_CLOSE(file); + fclose(file); if (m_deletePicsAfterCaching) remove(path); } @@ -2671,7 +2674,7 @@ CCoverFlow::CLRet CCoverFlow::_loadCoverTex(u32 i, bool box, bool hq) } } // - SAFE_CLOSE(file); + fclose(file); if (success) return CCoverFlow::CL_OK; } } @@ -2700,7 +2703,8 @@ int CCoverFlow::_coverLoader(CCoverFlow *cf) firstItem = cf->m_covers[cf->m_range / 2].index; i = loopNum((j & 1) ? firstItem - (j + 1) / 2 : firstItem + j / 2, cf->m_items.size()); LWP_MutexLock(cf->m_mutex); - SMART_FREE(cf->m_items[i].texture.data); + if(cf->m_items[i].texture.data.get()) + cf->m_items[i].texture.data.release(); cf->m_items[i].state = CCoverFlow::STATE_Loading; LWP_MutexUnlock(cf->m_mutex); } diff --git a/source/gui/gcvid.cpp b/source/gui/gcvid.cpp index 61665f4f..070ce2a5 100644 --- a/source/gui/gcvid.cpp +++ b/source/gui/gcvid.cpp @@ -368,7 +368,7 @@ VideoFile::VideoFile(FILE* f) VideoFile::~VideoFile() { - SAFE_CLOSE(_f); + fclose(_f); } int VideoFile::getWidth() const @@ -620,7 +620,7 @@ VideoFile* openVideo(const string& fileName) return new JpgVideoFile(f); default: - SAFE_CLOSE(f); + fclose(f); return NULL; } } diff --git a/source/gui/pngu.c b/source/gui/pngu.c index 102081f1..7043525d 100644 --- a/source/gui/pngu.c +++ b/source/gui/pngu.c @@ -153,8 +153,8 @@ int PNGU_DecodeToYCbYCr (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buff *(ctx->row_pointers[y]+x*6+3), *(ctx->row_pointers[y]+x*6+4), *(ctx->row_pointers[y]+x*6+5)); // Free resources - SAFE_FREE (ctx->img_data); - SAFE_FREE (ctx->row_pointers); + MEM2_free(ctx->img_data); + MEM2_free(ctx->row_pointers); // Success return PNGU_OK; @@ -177,8 +177,8 @@ int PNGU_DecodeToRGB565 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buff (((PNGU_u16) (ctx->row_pointers[y][x*3+2] & 0xF8)) >> 3); // Free resources - SAFE_FREE (ctx->img_data); - SAFE_FREE (ctx->row_pointers); + MEM2_free(ctx->img_data); + MEM2_free(ctx->row_pointers); // Success return PNGU_OK; @@ -213,8 +213,8 @@ int PNGU_DecodeToRGBA8 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffe } // Free resources - SAFE_FREE (ctx->img_data); - SAFE_FREE (ctx->row_pointers); + MEM2_free(ctx->img_data); + MEM2_free(ctx->row_pointers); // Success return PNGU_OK; @@ -276,8 +276,8 @@ int PNGU_DecodeTo4x4RGB565 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *b } // Free resources - SAFE_FREE (ctx->img_data); - SAFE_FREE (ctx->row_pointers); + MEM2_free(ctx->img_data); + MEM2_free(ctx->row_pointers); // Success return PNGU_OK; @@ -523,8 +523,8 @@ int PNGU_DecodeTo4x4RGB5A3 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *b } // Free resources - SAFE_FREE (ctx->img_data); - SAFE_FREE (ctx->row_pointers); + MEM2_free(ctx->img_data); + MEM2_free(ctx->row_pointers); // Success return PNGU_OK; @@ -647,8 +647,8 @@ int PNGU_DecodeTo4x4RGBA8 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *bu } // Free resources - SAFE_FREE (ctx->img_data); - SAFE_FREE (ctx->row_pointers); + MEM2_free(ctx->img_data); + MEM2_free(ctx->row_pointers); // Success return PNGU_OK; @@ -1123,8 +1123,8 @@ int pngu_decode (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, PNGU_u32 stripAlph { error: memcpy(png_jmpbuf(ctx->png_ptr), save_jmp, sizeof(save_jmp)); - SAFE_FREE(ctx->row_pointers); - SAFE_FREE(ctx->img_data); + MEM2_free(ctx->row_pointers); + MEM2_free(ctx->img_data); pngu_free_info (ctx); //printf("*** This is a corrupted image!!\n"); sleep(5); return mem_err ? PNGU_LIB_ERROR : -666; diff --git a/source/gui/text.cpp b/source/gui/text.cpp index cd326b6c..b6fb99d4 100644 --- a/source/gui/text.cpp +++ b/source/gui/text.cpp @@ -187,7 +187,8 @@ bool SFont::fromBuffer(const SmartBuf &buffer, u32 bufferSize, u32 size, u32 lsp weight = min(w, 32u); index = idx; - SMART_FREE(data); + if(data.get()) + data.release(); data = smartMem2Alloc(bufferSize); if(!data) return false; @@ -214,12 +215,13 @@ bool SFont::fromFile(const char *filename, u32 size, u32 lspacing, u32 w, u32 id u32 fileSize = ftell(file); fseek(file, 0, SEEK_SET); if (fileSize == 0) return false; - - SMART_FREE(data); + + if(data.get()) + data.release(); data = smartMem2Alloc(fileSize); if (!data) { - SAFE_CLOSE(file); + fclose(file); return false; } diff --git a/source/gui/texture.cpp b/source/gui/texture.cpp index 388f611b..6416dd87 100644 --- a/source/gui/texture.cpp +++ b/source/gui/texture.cpp @@ -211,9 +211,9 @@ STexture::TexErr STexture::fromPNGFile(const char *filename, u8 f, Alloc alloc, ptrPng = smartMem2Alloc(fileSize); if (!!ptrPng) if (fread(ptrPng.get(), 1, fileSize, file) != fileSize) - SMART_FREE(ptrPng); + ptrPng.release(); } - SAFE_CLOSE(file); + fclose(file); return !!ptrPng ? fromPNG(ptrPng.get(), f, alloc, minMipSize, maxMipSize) : STexture::TE_NOMEM; } @@ -319,8 +319,8 @@ STexture::TexErr STexture::fromPNG(const u8 *buffer, u8 f, Alloc alloc, u32 minM } if (!tmpData || !tmpData2) { - SMART_FREE(tmpData); - SMART_FREE(tmpData2); + tmpData.release(); + tmpData2.release(); PNGU_ReleaseImageContext(ctx); return STexture::TE_NOMEM; } diff --git a/source/gui/video.cpp b/source/gui/video.cpp index 935e1995..11356ccc 100644 --- a/source/gui/video.cpp +++ b/source/gui/video.cpp @@ -226,8 +226,8 @@ void CVideo::cleanup(void) gprintf("Cleaning up video...\n"); for (u32 i = 0; i < sizeof m_aaBuffer / sizeof m_aaBuffer[0]; ++i) { - SMART_FREE(m_aaBuffer[i]); - m_aaBufferSize[i] = 0; + if(m_aaBuffer[i].get()) + m_aaBuffer[i].release(); } //MEM1_free(m_fifo); } @@ -524,7 +524,8 @@ void CVideo::CheckWaitThread() LWP_JoinThread(waitThread, NULL); - SMART_FREE(waitThreadStack); + if(waitThreadStack.get()) + waitThreadStack.release(); waitThread = LWP_THREAD_NULL; m_waitMessages.clear(); diff --git a/source/homebrew/homebrew.cpp b/source/homebrew/homebrew.cpp index 76cc571c..2d332b38 100644 --- a/source/homebrew/homebrew.cpp +++ b/source/homebrew/homebrew.cpp @@ -79,10 +79,10 @@ int LoadHomebrew(const char * filepath) bool good_read = fread(homebrewbuffer, 1, filesize, file) == filesize; if (!good_read) { - SAFE_CLOSE(file); + fclose(file); return -4; } - SAFE_CLOSE(file); + fclose(file); homebrewsize += filesize; return 1; diff --git a/source/list/list.cpp b/source/list/list.cpp index 995ba129..2f18393c 100644 --- a/source/list/list.cpp +++ b/source/list/list.cpp @@ -198,7 +198,7 @@ void CList::GetHeaders(vector pathlist, vector fseek( fp, 0, SEEK_SET ); fread( &tmp.hdr, sizeof( discHdr ), 1, fp); - SAFE_CLOSE(fp); + fclose(fp); if ( tmp.hdr.gc_magic == 0xc2339f3d ) { @@ -280,7 +280,7 @@ void CList::GetHeaders(vector pathlist, vector { fseek(fp, wbfs ? 512 : 0, SEEK_SET); fread(&tmp.hdr, sizeof(discHdr), 1, fp); - SAFE_CLOSE(fp); + fclose(fp); } if (tmp.hdr.magic == 0x5D1C9EA3) diff --git a/source/loader/apploader.c b/source/loader/apploader.c index 1bef2654..f8202c15 100644 --- a/source/loader/apploader.c +++ b/source/loader/apploader.c @@ -17,6 +17,9 @@ typedef int (*app_main)(void **dst, int *size, int *offset); typedef void (*app_init)(void (*report)(const char *fmt, ...)); typedef void *(*app_final)(); typedef void (*app_entry)(void (**init)(void (*report)(const char *fmt, ...)), int (**main)(), void *(**final)()); + +/* Apploader pointers */ +static u8 *appldr = (u8 *) 0x81200000; /* Constants */ #define APPLDR_OFFSET 0x2440 @@ -33,27 +36,25 @@ s32 Apploader_Run(entry_point *entry, u8 vidMode, GXRModeObj *vmode, bool vipatc void *dst = NULL; int len = 0; int offset = 0; + u32 appldr_len; + s32 ret; app_init appldr_init; app_main appldr_main; - app_final appldr_final; - - /* Read apploader header */ - s32 ret = WDVD_Read(buffer, 0x20, APPLDR_OFFSET); - if (ret < 0) return ret; - - /* Calculate apploader length */ - u32 appldr_len = buffer[5] + buffer[6]; + app_final appldr_final; - SYS_SetArena1Hi(APPLOADER_END); + /* Read apploader header */ + ret = WDVD_Read(buffer, 0x20, APPLDR_OFFSET); + if (ret < 0) + return ret; - /* Read apploader code */ - // Either you limit memory usage or you don't touch the heap after that, because this is writing at 0x1200000 - ret = WDVD_Read(APPLOADER_START, appldr_len, APPLDR_OFFSET + 0x20); + /* Calculate apploader length */ + appldr_len = buffer[5] + buffer[6]; + + /* Read apploader code */ + ret = WDVD_Read(appldr, appldr_len, APPLDR_OFFSET + 0x20); if (ret < 0) return ret; - DCFlushRange(APPLOADER_START, appldr_len); - /* Set apploader entry function */ app_entry appldr_entry = (app_entry)buffer[4]; diff --git a/source/loader/cios.cpp b/source/loader/cios.cpp index 908bd850..84204170 100644 --- a/source/loader/cios.cpp +++ b/source/loader/cios.cpp @@ -45,7 +45,7 @@ bool cIOSInfo::D2X(u8 ios, u8 *base) if(!info) return false; *base = (u8)info->baseios; - SAFE_FREE(info); + free(info); return true; } @@ -64,14 +64,14 @@ iosinfo_t *cIOSInfo::GetInfo(u8 ios) if (ES_GetStoredTMD(TITLE_ID(1, ios), TMD, TMD_Length) < 0) { - SAFE_FREE(TMD); + free(TMD); return NULL; } char filepath[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32); sprintf(filepath, "/title/00000001/%08x/content/%08x.app", ios, *(u8 *)((u32)TMD+0x1E7)); - SAFE_FREE(TMD); + free(TMD); u32 size = 0; u8 *buffer = ISFS_GetFile((u8 *) filepath, &size, sizeof(iosinfo_t)); @@ -93,10 +93,10 @@ iosinfo_t *cIOSInfo::GetInfo(u8 ios) || !baseMatch /* Base */ || strncasecmp(iosinfo->name, "d2x", 3) != 0) /* Name */ { - SAFE_FREE(buffer); + free(buffer); return NULL; } - SAFE_FREE(buffer); + free(buffer); return iosinfo; } diff --git a/source/loader/disc.c b/source/loader/disc.c index 54ae450b..dff84d3b 100644 --- a/source/loader/disc.c +++ b/source/loader/disc.c @@ -359,7 +359,8 @@ s32 Disc_BootPartition(u64 offset, u8 vidMode, bool vipatch, bool countryString, IOSReloadBlock(IOS_GetVersion(), true); s32 ret = WDVD_OpenPartition(offset, 0, 0, 0, Tmd_Buffer); - if (ret < 0) return ret; + if (ret < 0) + return ret; /* Select an appropriate video mode */ __Disc_SelectVMode(vidMode, 0); @@ -369,14 +370,16 @@ s32 Disc_BootPartition(u64 offset, u8 vidMode, bool vipatch, bool countryString, /* Run apploader */ ret = Apploader_Run(&p_entry, vidMode, vmode, vipatch, countryString, patchVidMode, aspectRatio); - if (ret < 0) return ret; + if (ret < 0) + return ret; free_wip(); if (hooktype != 0) ocarina_do_code(); - gprintf("\n\nEntry Point is: %0x8\n", p_entry); + gprintf("\n\nEntry Point is: 0x%08x\n", p_entry); + appentrypoint = (u32)p_entry; /* Set time */ __Disc_SetTime(); @@ -400,10 +403,8 @@ s32 Disc_BootPartition(u64 offset, u8 vidMode, bool vipatch, bool countryString, // fix for PeppaPig memcpy((void*)0x800000F4,(char *) &temp_data, 4); - appentrypoint = (u32) p_entry; - gprintf("Jumping to entrypoint\n"); - + if (hooktype != 0) { __asm__( diff --git a/source/loader/fs.c b/source/loader/fs.c index e525fdbf..fc426353 100644 --- a/source/loader/fs.c +++ b/source/loader/fs.c @@ -28,7 +28,7 @@ u8 *ISFS_GetFile(u8 *path, u32 *size, s32 length) if (ISFS_Read(fd, (char*)buf, length) != length) { *size = 0; - SAFE_FREE(buf); + free(buf); } } } diff --git a/source/loader/fst.c b/source/loader/fst.c index a565e3a8..5370bb9e 100644 --- a/source/loader/fst.c +++ b/source/loader/fst.c @@ -443,7 +443,7 @@ int ocarina_do_code(u64 chantitle) { memcpy(codelist, code_buf, code_size); DCFlushRange(codelist, (u32)codelistend - (u32)codelist); - SAFE_FREE(code_buf); + MEM2_free(code_buf); } // TODO What's this??? diff --git a/source/loader/gc_disc.cpp b/source/loader/gc_disc.cpp index bd86b144..6ab27a1a 100644 --- a/source/loader/gc_disc.cpp +++ b/source/loader/gc_disc.cpp @@ -138,7 +138,7 @@ s32 GCDump::__DiscWrite(char * path, u64 offset, u32 length, u8 *ReadBuffer) wrote = __DiscWriteFile(f, offset, length, ReadBuffer); - SAFE_CLOSE(f); + fclose(f); return wrote; } @@ -446,7 +446,7 @@ s32 GCDump::DumpGame() { MEM2_free(ReadBuffer); MEM2_free(FSTBuffer); - SAFE_CLOSE(f); + fclose(f); return gc_error; } } @@ -455,7 +455,7 @@ s32 GCDump::DumpGame() gprintf("Updating FST\n"); fseek(f, FSTOffset, SEEK_SET); fwrite(fst, 1, FSTSize, f); - SAFE_CLOSE(f); + fclose(f); gprintf("Done!! Disc old size: %d, disc new size: %d, saved: %d\n", DiscSize, wrote, DiscSize - wrote); } diff --git a/source/loader/utils.h b/source/loader/utils.h index 75475367..32152577 100644 --- a/source/loader/utils.h +++ b/source/loader/utils.h @@ -16,12 +16,6 @@ #define ALIGN32(x) (((x) + 31) & ~31) #define ALIGNED(x) __attribute__((aligned(x))) -#define SMART_FREE(P) {if(!!P)P.release();} -#define SAFE_FREE(P) {if(P != NULL){free(P);P = NULL;}} -#define MEM2_SAFE_FREE(P) {if(P){MEM2_free(P);P = NULL;}} -#define SAFE_DELETE(P) {if(P != NULL){delete P;P = NULL;}} -#define SAFE_CLOSE(P) {if(P != NULL){fclose(P);P = NULL; }} - #define TITLE_ID(x,y) (((u64)(x) << 32) | (y)) #define TITLE_UPPER(x) ((u32)((x) >> 32)) #define TITLE_LOWER(x) ((u32)(x) & 0xFFFFFFFF) diff --git a/source/loader/wbfs.c b/source/loader/wbfs.c index 495cc323..0dcff972 100644 --- a/source/loader/wbfs.c +++ b/source/loader/wbfs.c @@ -86,7 +86,7 @@ s32 __WBFS_ReadDVD(void *fp, u32 lba, u32 len, void *iobuf) out: /* Free memory */ - SAFE_FREE(fp); + MEM2_free(fp); return ret; } diff --git a/source/loader/wbfs_ext.c b/source/loader/wbfs_ext.c index 027aa8bc..49115857 100644 --- a/source/loader/wbfs_ext.c +++ b/source/loader/wbfs_ext.c @@ -52,7 +52,7 @@ wbfs_disc_t* WBFS_Ext_OpenDisc(u8 *discid, char *fname) int fd = open(fname, O_RDONLY); if (fd == -1) return NULL; - wbfs_disc_t *iso_file = calloc(sizeof(wbfs_disc_t),1); + wbfs_disc_t *iso_file = MEM2_alloc(sizeof(wbfs_disc_t)); if (iso_file == NULL) return NULL; @@ -79,7 +79,7 @@ void WBFS_Ext_CloseDisc(wbfs_disc_t* disc) if (part == &wbfs_iso_file) { close((int)disc->header); - SAFE_FREE(disc); + MEM2_free(disc); return; } diff --git a/source/loader/wip.c b/source/loader/wip.c index 19ff418c..621b2861 100644 --- a/source/loader/wip.c +++ b/source/loader/wip.c @@ -69,7 +69,7 @@ void wip_reset_counter() void free_wip() { if(CodeList) - SAFE_FREE(CodeList); + MEM2_free(CodeList); CodesCount = 0; ProcessedLength = 0; @@ -115,7 +115,7 @@ int load_wip_patches(u8 *dir, u8 *gameid) if(!tmp) { MEM2_free(CodeList); - SAFE_CLOSE(fp); + fclose(fp); return -1; } @@ -126,7 +126,7 @@ int load_wip_patches(u8 *dir, u8 *gameid) CodeList[CodesCount].dstaddress = dstaddress; CodesCount++; } - SAFE_CLOSE(fp); + fclose(fp); gprintf("\n"); return 0; diff --git a/source/main.cpp b/source/main.cpp index 7cf2fc35..29f1ac64 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -18,21 +18,36 @@ #include "defines.h" #include "svnrev.h" -extern "C" { extern void __exception_setreload(int t);} - CMenu *mainMenu; -extern "C" void ShowError(const wstringEx &error){mainMenu->error(error); } -extern "C" void HideWaitMessage() {mainMenu->_hideWaitMessage(); } + +extern "C" +{ + extern void __exception_setreload(int t); + + void ShowError(const wstringEx &error) + { + mainMenu->error(error); + } + void HideWaitMessage() + { + mainMenu->_hideWaitMessage(); + } +} int main(int argc, char **argv) { - geckoinit = InitGecko(); __exception_setreload(5); + MEM2_init(52); + ISFS_Initialize(); + geckoinit = InitGecko(); gprintf(" \nWelcome to %s (%s-r%s)!\nThis is the debug output.\n", APP_NAME, APP_VERSION, SVN_REV); - SYS_SetArena1Hi(APPLOADER_START); + // Init video CVideo vid; + vid.init(); + WIILIGHT_Init(); + vid.waitMessage(0.2f); char *gameid = NULL; bool Emulator_boot = false; @@ -59,28 +74,19 @@ int main(int argc, char **argv) // Load Custom IOS bool iosOK = loadIOS(mainIOS, false); - MEM2_init(52); - - ISFS_Initialize(); - + u8 mainIOSBase = 0; iosOK = iosOK && cIOSInfo::D2X(mainIOS, &mainIOSBase); gprintf("Loaded cIOS: %u has base %u\n", mainIOS, mainIOSBase); - + Open_Inputs(); //init wiimote early - - // Init video - vid.init(); - WIILIGHT_Init(); - - vid.waitMessage(0.2f); - + // Init Sys_Init(); Sys_ExitTo(EXIT_TO_HBC); - + int ret = 0; - + do { bool deviceAvailable = false; @@ -92,8 +98,10 @@ int main(int argc, char **argv) sleep(1); for(u8 device = USB1; device <= USB8; device++) + { if(DeviceHandler::Instance()->IsInserted(device)) deviceAvailable = true; + } } if(DeviceHandler::Instance()->IsInserted(SD)) deviceAvailable = true; @@ -106,8 +114,6 @@ int main(int argc, char **argv) CMenu menu(vid); menu.init(); - //Open_Inputs(); //we should init inputs as last point - mainMenu = &menu; if (!iosOK) { diff --git a/source/memory/mem2.cpp b/source/memory/mem2.cpp index 4ee2dccd..faf8c048 100644 --- a/source/memory/mem2.cpp +++ b/source/memory/mem2.cpp @@ -47,10 +47,6 @@ void MEM1_free(void *p) void MEM2_init(unsigned int mem2Size) { g_mem2gp.init(mem2Size); - g_mem2gp.clear(); - - /* Protect space reserved for apploader */ - SYS_SetArena1Hi(APPLOADER_START); } void MEM2_cleanup(void) diff --git a/source/memory/smartptr.hpp b/source/memory/smartptr.hpp index a8184f2d..b0ac4b4c 100644 --- a/source/memory/smartptr.hpp +++ b/source/memory/smartptr.hpp @@ -26,13 +26,13 @@ public: switch (m_srcAlloc) { case SRCALL_NEW: - SAFE_DELETE(m_p); + delete m_p; break; default: - SAFE_FREE(m_p); + free(m_p); break; } - SAFE_DELETE(m_refcount); + delete m_refcount; } m_p = NULL; diff --git a/source/menu/menu.cpp b/source/menu/menu.cpp index dbbffa88..bf39c0d3 100644 --- a/source/menu/menu.cpp +++ b/source/menu/menu.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include "gecko.h" #include "defines.h" @@ -467,11 +468,9 @@ void CMenu::cleanup(bool ios_reload) m_cf.stopCoverLoader(); _stopSounds(); - + if (!ios_reload) - { - SMART_FREE(m_cameraSound); - } + m_cameraSound.release(); m_plugin.Cleanup(); @@ -491,11 +490,13 @@ void CMenu::cleanup(bool ios_reload) DeviceHandler::DestroyInstance(); if (!ios_reload) - { _cleanupDefaultFont(); - } + if (!ios_reload || (!m_use_wifi_gecko && ios_reload)) _deinitNetwork(); + + WIILIGHT_SetLevel(0); + WIILIGHT_TurnOff(); } void CMenu::_reload_wifi_gecko(void) @@ -1700,7 +1701,8 @@ void CMenu::_updateBg(void) return; } if (m_curBg.data.get() == m_prevBg.data.get()) - SMART_FREE(m_curBg.data); + m_curBg.data.release(); + m_vid.prepare(); GX_SetViewport(0.f, 0.f, 640.f, 480.f, 0.f, 1.f); guOrtho(projMtx, 0.f, 480.f, 0.f, 640.f, 0.f, 1000.0f); @@ -1868,8 +1870,9 @@ bool CMenu::_loadChannelList(void) gprintf("Written SYSCONF to: %s\n", filepath); fclose(file); } - else gprintf("Openning %s failed returning %i\n", filepath, file); - SAFE_FREE(sysconf); + else + gprintf("Openning %s failed returning %i\n", filepath, file); + free(sysconf); } sprintf(filepath, "/shared2/menu/FaceLib/RFL_DB.dat"); @@ -1885,8 +1888,9 @@ bool CMenu::_loadChannelList(void) gprintf("Written Mii's to: %s\n", filepath); fclose(file); } - else gprintf("Openning %s failed returning %i\n", filepath, file); - SAFE_FREE(meez); + else + gprintf("Openning %s failed returning %i\n", filepath, file); + free(meez); } first = false; } @@ -1905,7 +1909,8 @@ bool CMenu::_loadChannelList(void) Nand::Instance()->Disable_Emu(); failed = true; } - else failed = false; + else + failed = false; } if(!DeviceHandler::Instance()->IsInserted(currentPartition)) @@ -1920,7 +1925,7 @@ bool CMenu::_loadChannelList(void) m_cfg.setString("NAND", "lastlanguage", m_loc.getString(m_curLanguage, "gametdb_code", "EN")); m_cfg.save(); } - + lastPartition = currentPartition; last_emu_state = disable_emu; @@ -2104,11 +2109,10 @@ void CMenu::_stopSounds(void) bool CMenu::_loadFile(SmartBuf &buffer, u32 &size, const char *path, const char *file) { - SMART_FREE(buffer); size = 0; FILE *fp = fopen(file == NULL ? path : fmt("%s/%s", path, file), "rb"); - - if (fp == 0) return false; + if (fp == NULL) + return false; fseek(fp, 0, SEEK_END); u32 fileSize = ftell(fp); @@ -2116,34 +2120,42 @@ bool CMenu::_loadFile(SmartBuf &buffer, u32 &size, const char *path, const char SmartBuf fileBuf = smartAnyAlloc(fileSize); if (!fileBuf) { - SAFE_CLOSE(fp); + fclose(fp); return false; } if (fread(fileBuf.get(), 1, fileSize, fp) != fileSize) { - SAFE_CLOSE(fp); + fclose(fp); return false; } - SAFE_CLOSE(fp); + fclose(fp); + + if(buffer.get()) + buffer.release(); buffer = fileBuf; + size = fileSize; return true; } void CMenu::_load_installed_cioses() { - if (_installed_cios.size() > 0) return; + if (_installed_cios.size() > 0) + return; + gprintf("Loading cIOS map\n"); - + _installed_cios[0] = 1; u8 base = 0; - for (u8 slot = 100; slot < 254; slot++) + for (u8 slot = 200; slot < 254; slot++) + { if(cIOSInfo::D2X(slot, &base)) { gprintf("Found base %u in slot %u\n", base, slot); _installed_cios[slot] = base; } + } } void CMenu::_hideWaitMessage() @@ -2171,11 +2183,11 @@ void CMenu::_loadDefaultFont(bool korean) { u32 size; bool retry = false; - + // Read content.map from ISFS u8 *content = ISFS_GetFile((u8 *) "/shared1/content.map", &size, 0); int items = size / sizeof(map_entry_t); - + //gprintf("Open content.map, size %d, items %d\n", size, items); retry: @@ -2189,39 +2201,39 @@ retry: char u8_font_filename[22] = {0}; strcpy(u8_font_filename, "/shared1/XXXXXXXX.app"); // Faster than sprintf memcpy(u8_font_filename+9, cm[i].filename, 8); - + u8 *u8_font_archive = ISFS_GetFile((u8 *) u8_font_filename, &size, 0); - + //gprintf("Opened fontfile: %s: %d bytes\n", u8_font_filename, size); - + if (u8_font_archive != NULL) { const u8 *font_file = u8_get_file_by_index(u8_font_archive, 1, &size); // There is only one file in that app - + //gprintf("Extracted font: %d\n", size); - + m_base_font = smartMem2Alloc(size); memcpy(m_base_font.get(), font_file, size); if(!!m_base_font) m_base_font_size = size; } - SAFE_FREE(u8_font_archive); + free(u8_font_archive); break; } } - + if (!retry) { retry = true; goto retry; } - - SAFE_FREE(content); + + free(content); } void CMenu::_cleanupDefaultFont() { - SMART_FREE(m_base_font); + m_base_font.release(); m_base_font_size = 0; } @@ -2289,13 +2301,13 @@ bool CMenu::MIOSisDML() if(*(u32*)(appfile+i) == 0x44494F53) { gprintf("DML is installed as MIOS\n"); - SAFE_FREE(appfile); + free(appfile); return true; } } } - SAFE_FREE(appfile); + free(appfile); gprintf("DML is not installed as MIOS\n"); return false; } @@ -2303,21 +2315,23 @@ bool CMenu::MIOSisDML() void CMenu::RemoveCover( char * id ) { FILE *fp = fopen(fmt("%s/%s.png", m_boxPicDir.c_str(), id), "rb"); - if (fp != 0) + if (fp != NULL) { - SAFE_CLOSE(fp); + fclose(fp); remove(fmt("%s/%s.png", m_boxPicDir.c_str(), id)); } + fp = fopen(fmt("%s/%s.png", m_picDir.c_str(), id), "rb"); - if (fp != 0) + if (fp != NULL) { - SAFE_CLOSE(fp); + fclose(fp); remove(fmt("%s/%s.png", m_picDir.c_str(), id)); } + fp = fopen(fmt("%s/%s.wfc", m_cacheDir.c_str(), id), "rb"); - if (fp != 0) + if (fp != NULL) { - SAFE_CLOSE(fp); + fclose(fp); remove(fmt("%s/%s.wfc", m_cacheDir.c_str(), id)); } } diff --git a/source/menu/menu_about.cpp b/source/menu/menu_about.cpp index 26f6e6ad..e19c6653 100644 --- a/source/menu/menu_about.cpp +++ b/source/menu/menu_about.cpp @@ -22,7 +22,7 @@ void CMenu::_about(void) SetupInput(); _showAbout(); - do + while(1) { _mainLoopCommon(); @@ -74,7 +74,7 @@ void CMenu::_about(void) m_cf.startCoverLoader(); } } - } while (true); + } _hideAbout(false); } @@ -85,8 +85,10 @@ void CMenu::_hideAbout(bool instant) m_btnMgr.hide(m_aboutLblInfo, instant); m_btnMgr.hide(m_aboutBtnSystem, instant); for (u32 i = 0; i < ARRAY_SIZE(m_aboutLblUser); ++i) + { if (m_aboutLblUser[i] != -1u) m_btnMgr.hide(m_aboutLblUser[i], instant); + } } void CMenu::_showAbout(void) @@ -98,8 +100,10 @@ void CMenu::_showAbout(void) if (!m_locked) m_btnMgr.show(m_aboutBtnSystem); for (u32 i = 0; i < ARRAY_SIZE(m_aboutLblUser); ++i) + { if (m_aboutLblUser[i] != -1u) m_btnMgr.show(m_aboutLblUser[i]); + } } void CMenu::_initAboutMenu(CMenu::SThemeData &theme) @@ -111,12 +115,12 @@ void CMenu::_initAboutMenu(CMenu::SThemeData &theme) m_aboutLblInfo = _addText(theme, "ABOUT/INFO", theme.txtFont, L"", 20, 200, 600, 280, theme.txtFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_TOP); m_aboutBtnSystem = _addButton(theme, "ABOUT/SYSTEM_BTN", theme.btnFont, L"", 20, 400, 200, 56, theme.btnFontColor); m_aboutLblIOS = _addLabel(theme, "ABOUT/IOS", theme.txtFont, L"", 240, 400, 360, 56, theme.txtFontColor, FTGX_JUSTIFY_RIGHT | FTGX_ALIGN_MIDDLE); - // + _setHideAnim(m_aboutLblTitle, "ABOUT/TITLE", 0, 100, 0.f, 0.f); _setHideAnim(m_aboutLblInfo, "ABOUT/INFO", 0, 100, 0.f, 0.f); _setHideAnim(m_aboutBtnSystem, "ABOUT/SYSTEM_BTN", 0, 0, -2.f, 0.f); _setHideAnim(m_aboutLblIOS, "ABOUT/IOS", 0, 100, 0.f, 0.f); - // + _hideAbout(true); _textAbout(); } @@ -126,7 +130,9 @@ void CMenu::_textAbout(void) m_btnMgr.setText(m_aboutBtnSystem, _t("sys4", L"Update")); m_btnMgr.setText(m_aboutLblTitle, wfmt(_fmt("appname", L"%s (%s-r%s)"), APP_NAME, APP_VERSION, SVN_REV), false); - char *help = (char*)calloc(4096, sizeof(char)); + char *help = (char*)MEM2_alloc(4096 * sizeof(char)); + memset(help, 0, sizeof(help)); + FILE * f = fopen(fmt("%s/%s.txt", m_helpDir.c_str(), m_curLanguage.c_str()), "r"); if (f == NULL) f = fopen(fmt("%s/english.txt", m_helpDir.c_str()), "r"); @@ -152,7 +158,8 @@ void CMenu::_textAbout(void) wstringEx translator(wfmt(L", %s", m_loc.getWString(m_curLanguage, "translation_author").toUTF8().c_str())); wstringEx thanks(wfmt(_fmt("about4", L"Thanks To:\n%s"), THANKS)); - if(translator.size() > 3) thanks.append(translator); + if(translator.size() > 3) + thanks.append(translator); m_btnMgr.setText(m_aboutLblInfo, wfmt(L"%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s", @@ -167,12 +174,14 @@ void CMenu::_textAbout(void) false ); - SAFE_FREE(help); + MEM2_free(help); Nand::Instance()->Disable_Emu(); + iosinfo_t * iosInfo = cIOSInfo::GetInfo(mainIOS); if(iosInfo != NULL) m_btnMgr.setText(m_aboutLblIOS, wfmt(_fmt("ios", L"IOS%i base %i v%i"), mainIOS, iosInfo->baseios, iosInfo->version), true); - SAFE_FREE(iosInfo); + free(iosInfo); + if(m_current_view == COVERFLOW_CHANNEL && m_cfg.getInt("NAND", "emulation", 0) > 0) Nand::Instance()->Enable_Emu(); } diff --git a/source/menu/menu_cheat.cpp b/source/menu/menu_cheat.cpp index 42c11c3d..1d73c17a 100644 --- a/source/menu/menu_cheat.cpp +++ b/source/menu/menu_cheat.cpp @@ -29,7 +29,8 @@ void CMenu::_showCheatDownload(void) u32 CMenu::_downloadCheatFileAsync(void *obj) { CMenu *m = (CMenu *)obj; - if (!m->m_thrdWorking) return 0; + if (!m->m_thrdWorking) + return 0; m->m_thrdStop = false; @@ -42,7 +43,7 @@ u32 CMenu::_downloadCheatFileAsync(void *obj) m->m_thrdWorking = false; return -1; } - + u32 bufferSize = 0x080000; // Maximum download size 512kb SmartBuf buffer = smartAnyAlloc(bufferSize); if (!buffer) @@ -63,12 +64,14 @@ u32 CMenu::_downloadCheatFileAsync(void *obj) if (file != NULL) { fwrite(cheatfile.data, 1, cheatfile.size, file); - SAFE_CLOSE(file); + fclose(file); + buffer.release(); m->m_thrdWorking = false; return 0; } } - + + buffer.release(); m->m_thrdWorking = false; return -3; } diff --git a/source/menu/menu_download.cpp b/source/menu/menu_download.cpp index 229a6b4b..d42de396 100644 --- a/source/menu/menu_download.cpp +++ b/source/menu/menu_download.cpp @@ -29,6 +29,13 @@ #define GAMETDB_URL "http://www.gametdb.com/wiitdb.zip?LANG=%s&FALLBACK=TRUE&WIIWARE=TRUE&GAMECUBE=TRUE" #define UPDATE_URL_VERSION "http://dl.dropbox.com/u/25620767/WiiflowMod/versions.txt" +#define STACK_ALIGN(type, name, cnt, alignment) \ + u8 _al__##name[((sizeof(type)*(cnt)) + (alignment) + \ + (((sizeof(type)*(cnt))%(alignment)) > 0 ? ((alignment) - \ + ((sizeof(type)*(cnt))%(alignment))) : 0))]; \ + type *name = (type*)(((u32)(_al__##name)) + ((alignment) - (( \ + (u32)(_al__##name))&((alignment)-1)))) + static const char FMT_BPIC_URL[] = "http://art.gametdb.com/wii/coverfullHQ/{loc}/{gameid}.png"\ "|http://art.gametdb.com/wii/coverfull/{loc}/{gameid}.png"; static const char FMT_PIC_URL[] = "http://art.gametdb.com/wii/cover/{loc}/{gameid}.png"; @@ -372,7 +379,7 @@ static bool checkPNGFile(const char *filename) buffer = smartAnyAlloc(fileSize); if (!!buffer) fread(buffer.get(), 1, fileSize, file); } - SAFE_CLOSE(file); + fclose(file); return !buffer ? false : checkPNGBuf(buffer.get()); } @@ -391,7 +398,7 @@ bool CMenu::_isNetworkAvailable() if (buf && size > 4) { retval = buf[4] > 0; // There is a valid connection defined. - SAFE_FREE(buf); + free(buf); } return retval; } @@ -399,7 +406,7 @@ bool CMenu::_isNetworkAvailable() s32 CMenu::_networkComplete(s32 ok, void *usrData) { CMenu *m = (CMenu *) usrData; - + m->m_networkInit = ok == 0; m->m_thrdNetwork = false; @@ -436,13 +443,6 @@ int CMenu::_initNetwork() return val; } -#define STACK_ALIGN(type, name, cnt, alignment) \ - u8 _al__##name[((sizeof(type)*(cnt)) + (alignment) + \ - (((sizeof(type)*(cnt))%(alignment)) > 0 ? ((alignment) - \ - ((sizeof(type)*(cnt))%(alignment))) : 0))]; \ - type *name = (type*)(((u32)(_al__##name)) + ((alignment) - (( \ - (u32)(_al__##name))&((alignment)-1)))) - void CMenu::_deinitNetwork() { net_wc24cleanup(); @@ -466,6 +466,7 @@ int CMenu::_coverDownloader(bool missingOnly) _setThrdMsg(L"Not enough memory!", 1.f); LWP_MutexUnlock(m_mutex); m_thrdWorking = false; + buffer.release(); return 0; } bool savePNG = m_cfg.getBool("GENERAL", "keep_png", true); @@ -474,10 +475,10 @@ int CMenu::_coverDownloader(bool missingOnly) vector fmtURLFlat = stringToVector(m_cfg.getString("GENERAL", "url_flat_covers", FMT_PIC_URL), '|'); vector fmtURLCBox = stringToVector(m_cfg.getString("GENERAL", "url_custom_full_covers", FMT_CBPIC_URL), '|'); vector fmtURLCFlat = stringToVector(m_cfg.getString("GENERAL", "url_custom_flat_covers", FMT_CPIC_URL), '|'); - + u32 nbSteps = m_gameList.size(); u32 step = 0; - + GameTDB c_gameTDB; if (m_settingsDir.size() > 0) { @@ -517,6 +518,7 @@ int CMenu::_coverDownloader(bool missingOnly) _setThrdMsg(_t("dlmsg2", L"Network initialization failed!"), 1.f); LWP_MutexUnlock(m_mutex); m_thrdWorking = false; + buffer.release(); return 0; } m_thrdStepLen = dlWeight / (float)nbSteps; @@ -524,7 +526,7 @@ int CMenu::_coverDownloader(bool missingOnly) Config m_newID; m_newID.load(fmt("%s/newid.ini", m_settingsDir.c_str())); m_newID.setString("CHANNELS", "WFSF", "DWFA"); - + u32 CoverType = 0; for(u32 i = 0; i < coverList.size() && !m_thrdStop; ++i) @@ -535,7 +537,7 @@ int CMenu::_coverDownloader(bool missingOnly) bool original = true; bool custom = false; FILE *file = NULL; - + int c_altCase = 0; string newID = m_newID.getString(domain, coverList[i], coverList[i]); @@ -546,31 +548,30 @@ int CMenu::_coverDownloader(bool missingOnly) { gprintf("old id = %s\nnew id = %s\n", coverList[i].c_str(), newID.c_str()); } - + for( int p = 0; p < 4; ++p ) { switch(p) { case 0: CoverType = m_downloadPrioVal&C_TYPE_PRIOA ? CBOX : BOX; - break; + break; case 1: CoverType = m_downloadPrioVal&C_TYPE_PRIOA ? ( m_downloadPrioVal&C_TYPE_PRIOB ? CFLAT : BOX ) : ( m_downloadPrioVal&C_TYPE_PRIOB ? CBOX : FLAT ); - break; + break; case 2: CoverType = m_downloadPrioVal&C_TYPE_PRIOA ? ( m_downloadPrioVal&C_TYPE_PRIOB ? BOX : CFLAT ) : ( m_downloadPrioVal&C_TYPE_PRIOB ? FLAT : CBOX ); - break; + break; case 3: CoverType = m_downloadPrioVal&C_TYPE_PRIOA ? FLAT : CFLAT; - break; + break; } - + switch( CoverType ) { case BOX: if( m_downloadPrioVal&C_TYPE_ONOR ) original = false; - if (!success && !m_thrdStop && original) { path = sfmt("%s/%s.png", m_boxPicDir.c_str(), coverList[i].c_str()); @@ -579,103 +580,98 @@ int CMenu::_coverDownloader(bool missingOnly) for (u32 j = 0; !success && j < fmtURLBox.size() && !m_thrdStop; ++j) { url = makeURL(fmtURLBox[j], newID, countryCode(newID)); - if (j == 0) ++step; m_thrdStep = listWeight + dlWeight * (float)step / (float)nbSteps; LWP_MutexLock(m_mutex); _setThrdMsg(wfmt(_fmt("dlmsg3", L"Downloading from %s"), url.c_str()), m_thrdStep); LWP_MutexUnlock(m_mutex); download = downloadfile(buffer.get(), bufferSize, url.c_str(), CMenu::_downloadProgress, this); - + for( int o = 0; o < 12; ++o ) { bool tdl = false; if( download.data != NULL ) break; - switch( o ) { case EN: if(( newID[3] == 'E' || newID[3] == 'X' || newID[3] == 'Y' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_EN ) - { url = makeURL(fmtURLBox[j], newID, "EN"); tdl = true; - } - break; + break; case JA: if(newID[3] == 'J' && m_downloadPrioVal&C_TYPE_JA) { url = makeURL(fmtURLBox[j], newID, "JA"); tdl = true; } - break; + break; case FR: if((newID[3] == 'F' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_FR) - {; + { url = makeURL(fmtURLBox[j], newID, "FR"); tdl = true; } - break; + break; case DE: if((newID[3] == 'D' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_DE) { url = makeURL(fmtURLBox[j], newID, "DE"); tdl = true; } - break; + break; case ES: if((newID[3] == 'S' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_ES) { url = makeURL(fmtURLBox[j], newID, "ES"); tdl = true; } - break; + break; case IT: if((newID[3] == 'I' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_IT) { url = makeURL(fmtURLBox[j], newID, "IT"); tdl = true; } - break; + break; case NL: if(newID[3] == 'P' && m_downloadPrioVal&C_TYPE_NL) { url = makeURL(fmtURLBox[j], newID, "NL"); tdl = true; } - break; + break; case PT: if(newID[3] == 'P' && m_downloadPrioVal&C_TYPE_PT) { url = makeURL(fmtURLBox[j], newID, "PT"); tdl = true; } - break; + break; case RU: if((newID[3] == 'R' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_RU) { url = makeURL(fmtURLBox[j], newID, "RU"); tdl = true; } - break; + break; case KO: if(newID[3] == 'K' && m_downloadPrioVal&C_TYPE_KO) { url = makeURL(fmtURLBox[j], newID, "KO"); tdl = true; } - break; + break; case AU: if(newID[3] == 'W' && m_downloadPrioVal&C_TYPE_ZHCN) { url = makeURL(fmtURLBox[j], newID, "ZH"); tdl = true; } - break; + break; case ZHCN: - break; + break; } - if ( tdl ) { LWP_MutexLock(m_mutex); @@ -684,7 +680,6 @@ int CMenu::_coverDownloader(bool missingOnly) download = downloadfile(buffer.get(), bufferSize, url.c_str(), CMenu::_downloadProgress, this); } } - if (download.data != NULL) { if (savePNG) @@ -696,7 +691,7 @@ int CMenu::_coverDownloader(bool missingOnly) if (file != NULL) { fwrite(download.data, download.size, 1, file); - SAFE_CLOSE(file); + fclose(file); } } @@ -712,13 +707,11 @@ int CMenu::_coverDownloader(bool missingOnly) } } } - break; + break; case CBOX: if( m_downloadPrioVal&C_TYPE_ONCU ) custom = true; - c_altCase = c_gameTDB.GetCaseVersions( coverList[i].c_str() ); - if (!success && !m_thrdStop && c_gameTDB.IsLoaded() && c_altCase > 1 && custom) { path = sfmt("%s/%s.png", m_boxPicDir.c_str(), coverList[i].c_str()); @@ -727,14 +720,12 @@ int CMenu::_coverDownloader(bool missingOnly) for (u32 j = 0; !success && j < fmtURLCBox.size() && !m_thrdStop; ++j) { url = makeURL(fmtURLCBox[j], newID, countryCode(newID)); - if (j == 0) ++step; m_thrdStep = listWeight + dlWeight * (float)step / (float)nbSteps; LWP_MutexLock(m_mutex); _setThrdMsg(wfmt(_fmt("dlmsg3", L"Downloading from %s"), url.c_str()), m_thrdStep); LWP_MutexUnlock(m_mutex); download = downloadfile(buffer.get(), bufferSize, url.c_str(), CMenu::_downloadProgress, this); - for( int o = 0; o < 12; ++o ) { bool tdl = false; @@ -749,82 +740,81 @@ int CMenu::_coverDownloader(bool missingOnly) url = makeURL(fmtURLCBox[j], newID, "EN"); tdl = true; } - break; + break; case JA: if(newID[3] == 'J' && m_downloadPrioVal&C_TYPE_JA) { url = makeURL(fmtURLCBox[j], newID, "JA"); tdl = true; } - break; + break; case FR: if((newID[3] == 'F' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_FR) { url = makeURL(fmtURLCBox[j], newID, "FR"); tdl = true; } - break; + break; case DE: if((newID[3] == 'D' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_DE) { url = makeURL(fmtURLCBox[j], newID, "DE"); tdl = true; } - break; + break; case ES: if((newID[3] == 'S' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_ES) { - url = makeURL(fmtURLCBox[j], newID, "ES"); tdl = true; } - break; + break; case IT: if((newID[3] == 'I' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_IT) { url = makeURL(fmtURLCBox[j], newID, "IT"); tdl = true; } - break; + break; case NL: if(newID[3] == 'P' && m_downloadPrioVal&C_TYPE_NL) { url = makeURL(fmtURLCBox[j], newID, "NL"); tdl = true; } - break; + break; case PT: if(newID[3] == 'P' && m_downloadPrioVal&C_TYPE_PT) { url = makeURL(fmtURLCBox[j], newID, "PT"); tdl = true; } - break; + break; case RU: if((newID[3] == 'R' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_RU) { url = makeURL(fmtURLCBox[j], newID, "RU"); tdl = true; } - break; + break; case KO: if(newID[3] == 'K' && m_downloadPrioVal&C_TYPE_KO) { url = makeURL(fmtURLCBox[j], newID, "KO"); tdl = true; } - break; + break; case AU: if(newID[3] == 'W' && m_downloadPrioVal&C_TYPE_ZHCN) { url = makeURL(fmtURLCBox[j], newID, "ZH"); tdl = true; } - break; + break; case ZHCN: - break; + break; } - + if ( tdl ) { LWP_MutexLock(m_mutex); @@ -845,7 +835,7 @@ int CMenu::_coverDownloader(bool missingOnly) if (file != NULL) { fwrite(download.data, download.size, 1, file); - SAFE_CLOSE(file); + fclose(file); } } @@ -861,11 +851,10 @@ int CMenu::_coverDownloader(bool missingOnly) } } } - break; + break; case FLAT: if( m_downloadPrioVal&C_TYPE_ONOR ) original = false; - if (!success && !m_thrdStop && original) { path = sfmt("%s/%s.png", m_picDir.c_str(), coverList[i].c_str()); @@ -880,13 +869,13 @@ int CMenu::_coverDownloader(bool missingOnly) _setThrdMsg(wfmt(_fmt("dlmsg8", L"Full cover not found. Downloading from %s"), url.c_str()), listWeight + dlWeight * (float)step / (float)nbSteps); LWP_MutexUnlock(m_mutex); download = downloadfile(buffer.get(), bufferSize, url.c_str(), CMenu::_downloadProgress, this); - + for( int o = 0; o < 12; ++o ) { bool tdl = false; if( download.data != NULL ) break; - + switch( o ) { case EN: @@ -895,81 +884,80 @@ int CMenu::_coverDownloader(bool missingOnly) url = makeURL(fmtURLFlat[j], newID, "EN"); tdl = true; } - break; + break; case JA: if(newID[3] == 'J' && m_downloadPrioVal&C_TYPE_JA) { url = makeURL(fmtURLFlat[j], newID, "JA"); tdl = true; } - break; + break; case FR: if((newID[3] == 'F' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_FR) { url = makeURL(fmtURLFlat[j], newID, "FR"); tdl = true; } - break; + break; case DE: if((newID[3] == 'D' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_DE) { url = makeURL(fmtURLFlat[j], newID, "DE"); tdl = true; } - break; + break; case ES: if((newID[3] == 'S' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_ES) { url = makeURL(fmtURLFlat[j], newID, "ES"); tdl = true; } - break; + break; case IT: if((newID[3] == 'I' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_IT) { url = makeURL(fmtURLFlat[j], newID, "IT"); tdl = true; } - break; + break; case NL: if(newID[3] == 'P' && m_downloadPrioVal&C_TYPE_NL) { url = makeURL(fmtURLFlat[j], newID, "NL"); tdl = true; } - break; + break; case PT: if(newID[3] == 'P' && m_downloadPrioVal&C_TYPE_PT) { url = makeURL(fmtURLFlat[j], newID, "PT"); tdl = true; } - break; + break; case RU: if((newID[3] == 'R' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_RU) { url = makeURL(fmtURLFlat[j], newID, "RU"); tdl = true; } - break; + break; case KO: if(newID[3] == 'K' && m_downloadPrioVal&C_TYPE_KO) { url = makeURL(fmtURLFlat[j], newID, "KO"); tdl = true; } - break; + break; case AU: if(newID[3] == 'W' && m_downloadPrioVal&C_TYPE_ZHCN) { url = makeURL(fmtURLFlat[j], newID, "ZH"); tdl = true; } - break; + break; case ZHCN: - break; + break; } - if ( tdl ) { LWP_MutexLock(m_mutex); @@ -978,7 +966,7 @@ int CMenu::_coverDownloader(bool missingOnly) download = downloadfile(buffer.get(), bufferSize, url.c_str(), CMenu::_downloadProgress, this); } } - + if (download.data != NULL) { if (savePNG) @@ -990,7 +978,7 @@ int CMenu::_coverDownloader(bool missingOnly) if (file != NULL) { fwrite(download.data, download.size, 1, file); - SAFE_CLOSE(file); + fclose(file); } } @@ -1006,11 +994,10 @@ int CMenu::_coverDownloader(bool missingOnly) } } } - break; + break; case CFLAT: if( m_downloadPrioVal&C_TYPE_ONCU ) custom = true; - if (!success && !m_thrdStop && c_gameTDB.IsLoaded() && c_altCase > 1 && custom) { path = sfmt("%s/%s.png", m_picDir.c_str(), coverList[i].c_str()); @@ -1025,13 +1012,13 @@ int CMenu::_coverDownloader(bool missingOnly) _setThrdMsg(wfmt(_fmt("dlmsg8", L"Full cover not found. Downloading from %s"), url.c_str()), listWeight + dlWeight * (float)step / (float)nbSteps); LWP_MutexUnlock(m_mutex); download = downloadfile(buffer.get(), bufferSize, url.c_str(), CMenu::_downloadProgress, this); - + for( int o = 0; o < 12; ++o ) { bool tdl = false; if( download.data != NULL ) break; - + switch( o ) { case EN: @@ -1040,81 +1027,80 @@ int CMenu::_coverDownloader(bool missingOnly) url = makeURL(fmtURLCFlat[j], newID, "EN"); tdl = true; } - break; + break; case JA: if(newID[3] == 'J' && m_downloadPrioVal&C_TYPE_JA) { url = makeURL(fmtURLCFlat[j], newID, "JA"); tdl = true; } - break; + break; case FR: if((newID[3] == 'F' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_FR) { url = makeURL(fmtURLCFlat[j], newID, "FR"); tdl = true; } - break; + break; case DE: if((newID[3] == 'D' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_DE) { url = makeURL(fmtURLCFlat[j], newID, "DE"); tdl = true; } - break; + break; case ES: if((newID[3] == 'S' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_ES) { url = makeURL(fmtURLCFlat[j], newID, "ES"); tdl = true; } - break; + break; case IT: if((newID[3] == 'I' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_IT) { url = makeURL(fmtURLCFlat[j], newID, "IT"); tdl = true; } - break; + break; case NL: if(newID[3] == 'P' && m_downloadPrioVal&C_TYPE_NL) { url = makeURL(fmtURLCFlat[j], newID, "NL"); tdl = true; } - break; + break; case PT: if(newID[3] == 'P' && m_downloadPrioVal&C_TYPE_PT) { url = makeURL(fmtURLCFlat[j], newID, "PT"); tdl = true; } - break; + break; case RU: if((newID[3] == 'R' || newID[3] == 'P') && m_downloadPrioVal&C_TYPE_RU) { url = makeURL(fmtURLCFlat[j], newID, "RU"); tdl = true; } - break; + break; case KO: if(newID[3] == 'K' && m_downloadPrioVal&C_TYPE_KO) { url = makeURL(fmtURLCFlat[j], newID, "KO"); tdl = true; } - break; + break; case AU: if((newID[3] == 'P' || newID[3] == 'Y' || newID[3] == 'X') && m_downloadPrioVal&C_TYPE_ZHCN) { url = makeURL(fmtURLCFlat[j], newID, "ZH"); tdl = true; } - break; + break; case ZHCN: - break; + break; } - if ( tdl ) { LWP_MutexLock(m_mutex); @@ -1123,7 +1109,6 @@ int CMenu::_coverDownloader(bool missingOnly) download = downloadfile(buffer.get(), bufferSize, url.c_str(), CMenu::_downloadProgress, this); } } - if (download.data != NULL) { if (savePNG) @@ -1135,7 +1120,7 @@ int CMenu::_coverDownloader(bool missingOnly) if (file != NULL) { fwrite(download.data, download.size, 1, file); - SAFE_CLOSE(file); + fclose(file); } } @@ -1151,15 +1136,15 @@ int CMenu::_coverDownloader(bool missingOnly) } } } - break; - } - } + break; + } + } newID.clear(); ++step; } if(c_gameTDB.IsLoaded()) c_gameTDB.CloseFile(); - + coverList.clear(); m_newID.unload(); } @@ -1170,6 +1155,7 @@ int CMenu::_coverDownloader(bool missingOnly) _setThrdMsg(wfmt(_fmt("dlmsg9", L"%i/%i files downloaded. %i are front covers only."), count + countFlat, n, countFlat), 1.f); LWP_MutexUnlock(m_mutex); m_thrdWorking = false; + buffer.release(); return 0; } @@ -1178,7 +1164,7 @@ void CMenu::_download(string gameId) lwp_t thread = LWP_THREAD_NULL; int msg = 0; wstringEx prevMsg; - + bool _updateGametdb = false; SetupInput(); @@ -1218,13 +1204,9 @@ void CMenu::_download(string gameId) m_btnMgr.hide(m_downloadBtnGameTDBDownload); m_btnMgr.hide(m_downloadLblCovers); m_btnMgr.hide(m_downloadLblGameTDBDownload); - //m_btnMgr.hide(m_downloadLblCoverPrio); - //m_btnMgr.hide(m_downloadLblPrio); - //m_btnMgr.hide(m_downloadBtnPrioM); - //m_btnMgr.hide(m_downloadBtnPrioP); m_btnMgr.hide(m_downloadLblCoverSet); m_btnMgr.hide(m_downloadBtnCoverSet); - + m_thrdStop = false; m_thrdWorking = true; gameId.clear(); @@ -1436,7 +1418,6 @@ void CMenu::_download(string gameId) else if (m_btnMgr.selected(m_downloadBtnGameTDBDownload) && !m_thrdWorking) { -// bool dlAll = m_btnMgr.selected(m_downloadBtnAllTitles); m_btnMgr.show(m_downloadPBar); m_btnMgr.setProgress(m_downloadPBar, 0.f); _hideSettings(); @@ -1449,7 +1430,7 @@ void CMenu::_download(string gameId) m_btnMgr.hide(m_downloadBtnCoverSet); m_thrdStop = false; m_thrdWorking = true; - + _updateGametdb = true; LWP_CreateThread(&thread, (void *(*)(void *))CMenu::_gametdbDownloader, (void *)this, 0, 8192, 40); @@ -1556,7 +1537,6 @@ void CMenu::_initDownloadMenu(CMenu::SThemeData &theme) m_downloadBtnAUs = _addPicButton(theme, "DOWNLOAD/AUS", theme.btnAUOn, theme.btnAUOns, 465, 340, 120, 56); m_downloadBtnBack = _addButton(theme, "DOWNLOAD/BACK_BTN", theme.btnFont, L"", 420, 410, 200, 56, theme.btnFontColor); - // Download menu _setHideAnim(m_downloadLblTitle, "DOWNLOAD/TITLE", 0, 0, -2.f, 0.f); _setHideAnim(m_downloadPBar, "DOWNLOAD/PROGRESS_BAR", 0, 0, -2.f, 0.f); @@ -1647,7 +1627,6 @@ void CMenu::_textDownload(void) m_btnMgr.setText(m_downloadBtnZHCNs, L"ZHCN"); m_btnMgr.setText(m_downloadBtnAUs, L"AU"); m_btnMgr.setText(m_downloadBtnBack, _t("dl18", L"Back")); - } s8 CMenu::_versionTxtDownloaderInit(CMenu *m) //Handler to download versions txt file @@ -1658,7 +1637,7 @@ s8 CMenu::_versionTxtDownloaderInit(CMenu *m) //Handler to download versions txt s8 CMenu::_versionTxtDownloader() // code to download new version txt file { - u32 bufferSize = 0x001000; // Maximum download size 4kb + u32 bufferSize = 0x010000; // Maximum download size 64kb SmartBuf buffer = smartAnyAlloc(bufferSize); if (!buffer) { @@ -1672,7 +1651,7 @@ s8 CMenu::_versionTxtDownloader() // code to download new version txt file LWP_MutexLock(m_mutex); _setThrdMsg(_t("dlmsg1", L"Initializing network..."), 0.f); LWP_MutexUnlock(m_mutex); - + if (_initNetwork() < 0) { LWP_MutexLock(m_mutex); @@ -1707,7 +1686,7 @@ s8 CMenu::_versionTxtDownloader() // code to download new version txt file if (file != NULL) { fwrite(download.data, 1, download.size, file); - SAFE_CLOSE(file); + fclose(file); // version file valid, check for version with SVN_REV int svnrev = atoi(SVN_REV); @@ -1740,12 +1719,14 @@ s8 CMenu::_versionTxtDownloader() // code to download new version txt file } } m_thrdWorking = false; + buffer.release(); return 0; } s8 CMenu::_versionDownloaderInit(CMenu *m) //Handler to download new dol { - if (!m->m_thrdWorking) return 0; + if (!m->m_thrdWorking) + return 0; return m->_versionDownloader(); } @@ -1755,9 +1736,11 @@ s8 CMenu::_versionDownloader() // code to download new version strcpy(dol_backup, m_dol.c_str()); strcat(dol_backup, ".backup"); - if (m_app_update_size == 0) m_app_update_size = 0x400000; - if (m_data_update_size == 0) m_data_update_size = 0x400000; - + if (m_app_update_size == 0) + m_app_update_size = 0x400000; + if (m_data_update_size == 0) + m_data_update_size = 0x400000; + // check for existing dol ifstream filestr; gprintf("DOL Path: %s\n", m_dol.c_str()); @@ -1803,6 +1786,7 @@ s8 CMenu::_versionDownloader() // code to download new version LWP_MutexUnlock(m_mutex); sleep(3); m_thrdWorking = false; + buffer.release(); return 0; } @@ -1824,6 +1808,7 @@ s8 CMenu::_versionDownloader() // code to download new version LWP_MutexUnlock(m_mutex); sleep(3); m_thrdWorking = false; + buffer.release(); return 0; } @@ -1841,7 +1826,7 @@ s8 CMenu::_versionDownloader() // code to download new version if (file != NULL) { fwrite(download.data, 1, download.size, file); - SAFE_CLOSE(file); + fclose(file); LWP_MutexLock(m_mutex); _setThrdMsg(_t("dlmsg24", L"Extracting..."), 0.8f); @@ -1851,7 +1836,8 @@ s8 CMenu::_versionDownloader() // code to download new version bool result = zFile.ExtractAll(m_app_update_drive); remove(m_app_update_zip.c_str()); - if (!result) goto fail; + if (!result) + goto fail; //Update apps dir succeeded, try to update the data dir. download.data = NULL; @@ -1883,7 +1869,7 @@ s8 CMenu::_versionDownloader() // code to download new version if (file != NULL) { fwrite(download.data, 1, download.size, file); - SAFE_CLOSE(file); + fclose(file); LWP_MutexLock(m_mutex); _setThrdMsg(_t("dlmsg24", L"Extracting..."), 0.8f); @@ -1930,6 +1916,7 @@ fail: _setThrdMsg(_t("dlmsg15", L"Saving failed!"), 1.f); LWP_MutexUnlock(m_mutex); out: + buffer.release(); sleep(3); m_thrdWorking = false; return 0; @@ -1999,7 +1986,7 @@ int CMenu::_gametdbDownloaderAsync() else { fwrite(download.data, download.size, 1, file); - SAFE_CLOSE(file); + fclose(file); gprintf("Extracting zip file: "); @@ -2010,11 +1997,11 @@ int CMenu::_gametdbDownloaderAsync() // We don't need the zipfile anymore remove(zippath.c_str()); - + // We should always remove the offsets file to make sure it's reloaded string offsetspath = sfmt("%s/gametdb_offsets.bin", m_settingsDir.c_str()); remove(offsetspath.c_str()); - + // Update cache m_gameList.SetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str()); UpdateCache(); @@ -2022,7 +2009,7 @@ int CMenu::_gametdbDownloaderAsync() LWP_MutexLock(m_mutex); _setThrdMsg(_t("dlmsg26", L"Updating cache..."), 0.f); LWP_MutexUnlock(m_mutex); - + m_GameTDBLoaded = true; _loadList(); @@ -2030,6 +2017,7 @@ int CMenu::_gametdbDownloaderAsync() } } } + buffer.release(); m_thrdWorking = false; return 0; -} \ No newline at end of file +} diff --git a/source/menu/menu_game.cpp b/source/menu/menu_game.cpp index b68323ce..2b9cdeaa 100644 --- a/source/menu/menu_game.cpp +++ b/source/menu/menu_game.cpp @@ -399,17 +399,16 @@ void CMenu::_game(bool launch) FILE *file = fopen(videoPath.c_str(), "rb"); if (file) { - SAFE_CLOSE(file); - + fclose(file); _hideGame(); WiiMovie movie(videoPath.c_str()); movie.SetScreenSize(m_cfg.getInt("GENERAL", "tv_width", 640), m_cfg.getInt("GENERAL", "tv_height", 480), m_cfg.getInt("GENERAL", "tv_x", 0), m_cfg.getInt("GENERAL", "tv_y", 0)); movie.SetVolume(m_cfg.getInt("GENERAL", "sound_volume_bnr", 255)); //_stopSounds(); movie.Play(); - + m_video_playing = true; - + STexture videoBg; while (!BTN_B_PRESSED && !BTN_A_PRESSED && !BTN_HOME_PRESSED && movie.GetNextFrame(&videoBg)) { @@ -1393,21 +1392,22 @@ void CMenu::_gameSoundThread(CMenu *m) _extractBnr(m->m_gameSoundHdr) : m->m_current_view == COVERFLOW_CHANNEL ? _extractChannelBnr(m->m_gameSoundHdr->hdr.chantitle) : NULL; m->m_gameSoundHdr = NULL; - + if (banner == NULL || !banner->IsValid()) { gprintf("no valid banner found\n"); - SAFE_DELETE(banner); + delete banner; return; } _extractBannerTitle(banner, GetLanguage(m->m_loc.getString(m->m_curLanguage, "gametdb_code", "EN").c_str())); - + const u8 *soundBin = banner->GetFile((char *) "sound.bin", &sndSize); - SAFE_DELETE(banner); - + delete banner; + if (soundBin == NULL || (((IMD5Header *)soundBin)->fcc != 'IMD5' && ((IMD5Header *)soundBin)->fcc != 'RIFF')) { gprintf("Failed to load banner sound!\n\n"); + delete soundBin; return; } @@ -1435,7 +1435,7 @@ void CMenu::CheckGameSoundThread() LWP_JoinThread(m_gameSoundThread, NULL); if(gameSoundThreadStack.get()) - SMART_FREE(gameSoundThreadStack); + gameSoundThreadStack.release(); m_gameSoundThread = LWP_THREAD_NULL; } diff --git a/source/menu/menu_main.cpp b/source/menu/menu_main.cpp index 36b9a870..4c74979a 100644 --- a/source/menu/menu_main.cpp +++ b/source/menu/menu_main.cpp @@ -278,7 +278,8 @@ int CMenu::main(void) { LWP_JoinThread(coverStatus, NULL); coverStatus = LWP_THREAD_NULL; - SMART_FREE(coverstatus_stack); + if(coverstatus_stack.get()) + coverstatus_stack.release(); WDVD_GetCoverStatus(&disc_check); } @@ -753,7 +754,6 @@ int CMenu::main(void) m_btnMgr.show(m_mainBtnHomebrew); else m_btnMgr.show(m_mainBtnUsb); - break; } m_btnMgr.show(m_mainLblUser[2]); m_btnMgr.show(m_mainLblUser[3]); @@ -780,15 +780,16 @@ int CMenu::main(void) m_btnMgr.hide(m_mainLblUser[4]); m_btnMgr.hide(m_mainLblUser[5]); } - // for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) + { if (WPadIR_Valid(chan) || (m_show_pointer[chan] && !WPadIR_Valid(chan))) m_cf.mouse(m_vid, chan, m_cursor[chan].x(), m_cursor[chan].y()); else - m_cf.mouse(m_vid, chan, -1, -1); + m_cf.mouse(m_vid, chan, -1, -1); + } } _showWaitMessage(); - // + gprintf("Invalidate GX\n"); GX_InvVtxCache(); @@ -802,7 +803,9 @@ int CMenu::main(void) gprintf("Wait for dvd\n"); LWP_JoinThread(coverStatus, NULL); coverStatus = LWP_THREAD_NULL; - SMART_FREE(coverstatus_stack); + if(coverstatus_stack.get()) + coverstatus_stack.release(); + gprintf("Done with main\n"); return m_reload ? 1 : 0; }