mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-11-25 04:36:53 +01:00
*Reworked all update functions
*Fixed endless loop when disc button was selected *Fixed crash on exit *Fixed discart download to not download custom/originals if set so in the settings *Hopefully fixed discart download problem *Reworked DirList class
This commit is contained in:
parent
f7c1e9958d
commit
3f03d92295
Binary file not shown.
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 104 KiB |
@ -27,17 +27,16 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <string>
|
||||||
|
#include <algorithm>
|
||||||
#include <sys/dir.h>
|
#include <sys/dir.h>
|
||||||
|
|
||||||
#include "utils/StringTools.h"
|
#include "utils/StringTools.h"
|
||||||
#include "DirList.h"
|
#include "DirList.h"
|
||||||
|
|
||||||
DirList::DirList(const char * path, const char *filter)
|
DirList::DirList(const char * path, const char *filter, u32 flags)
|
||||||
{
|
{
|
||||||
filecount = 0;
|
this->LoadPath(path, filter, flags);
|
||||||
FileInfo = NULL;
|
|
||||||
|
|
||||||
this->LoadPath(path, filter);
|
|
||||||
this->SortList();
|
this->SortList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,185 +45,145 @@ DirList::~DirList()
|
|||||||
ClearList();
|
ClearList();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DirList::LoadPath(const char * folder, const char *filter)
|
bool DirList::LoadPath(const char * folder, const char *filter, u32 flags)
|
||||||
{
|
{
|
||||||
|
if(!folder)
|
||||||
|
return false;
|
||||||
|
|
||||||
struct stat st;
|
struct stat st;
|
||||||
DIR_ITER *dir = NULL;
|
DIR_ITER *dir = NULL;
|
||||||
char filename[1024];
|
std::string folderpath = folder;
|
||||||
|
|
||||||
char folderpath[strlen(folder)+2];
|
if(folderpath[folderpath.size()-1] == '/')
|
||||||
sprintf(folderpath, "%s", folder);
|
folderpath[folderpath.size()-1] = '\0';
|
||||||
|
|
||||||
if(folderpath[strlen(folderpath)-1] == '/')
|
const char * notRoot = strrchr(folderpath.c_str(), '/');
|
||||||
folderpath[strlen(folderpath)-1] = '\0';
|
|
||||||
|
|
||||||
char * notRoot = strrchr(folderpath, '/');
|
|
||||||
if(!notRoot)
|
if(!notRoot)
|
||||||
{
|
folderpath += '/';
|
||||||
strcat(folderpath, "/");
|
|
||||||
}
|
|
||||||
|
|
||||||
dir = diropen(folderpath);
|
dir = diropen(folderpath.c_str());
|
||||||
if (dir == NULL)
|
if (dir == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
char * filename = new (std::nothrow) char[1024];
|
||||||
|
if(!filename)
|
||||||
|
{
|
||||||
|
dirclose(dir);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
while (dirnext(dir,filename,&st) == 0)
|
while (dirnext(dir,filename,&st) == 0)
|
||||||
{
|
{
|
||||||
if (strcmp(filename,".") != 0 && strcmp(filename,"..") != 0)
|
if(st.st_mode & S_IFDIR)
|
||||||
{
|
{
|
||||||
if(filter)
|
if(!(flags & Dirs))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(strcmp(filename,".") == 0 || strcmp(filename,"..") == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(flags & CheckSubfolders)
|
||||||
{
|
{
|
||||||
char * fileext = strrchr(filename, '.');
|
std::string newFolder = folderpath;
|
||||||
if(fileext)
|
if(notRoot) newFolder += '/';
|
||||||
{
|
newFolder += filename;
|
||||||
if(strtokcmp(fileext, filter, ",") == 0)
|
LoadPath(newFolder.c_str(), filter, flags);
|
||||||
{
|
|
||||||
bool result = AddEntrie(folderpath, filename, st.st_size, (st.st_mode & S_IFDIR) ? true : false);
|
|
||||||
if(!result)
|
|
||||||
{
|
|
||||||
dirclose(dir);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bool result = AddEntrie(folderpath, filename, st.st_size, (st.st_mode & S_IFDIR) ? true : false);
|
|
||||||
if(!result)
|
|
||||||
{
|
|
||||||
dirclose(dir);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(!(flags & Files))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(filter)
|
||||||
|
{
|
||||||
|
char * fileext = strrchr(filename, '.');
|
||||||
|
if(!fileext)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(strtokcmp(fileext, filter, ",") == 0)
|
||||||
|
AddEntrie(folderpath.c_str(), filename, st.st_size, (st.st_mode & S_IFDIR) ? true : false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AddEntrie(folderpath.c_str(), filename, st.st_size, (st.st_mode & S_IFDIR) ? true : false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
dirclose(dir);
|
dirclose(dir);
|
||||||
|
delete [] filename;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DirList::AddEntrie(const char * folderpath, const char * filename, u64 filesize, bool isDir)
|
void DirList::AddEntrie(const char * folderpath, const char * filename, u64 filesize, bool isDir)
|
||||||
{
|
{
|
||||||
if(!FileInfo)
|
if(!folderpath || !filename)
|
||||||
{
|
return;
|
||||||
FileInfo = (FileInfos *) malloc(sizeof(FileInfos));
|
|
||||||
if (!FileInfo)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
FileInfos *TempFileInfo = (FileInfos *) realloc(FileInfo, (filecount+1)*sizeof(FileInfos));
|
int pos = FileInfo.size();
|
||||||
|
|
||||||
if (!TempFileInfo)
|
FileInfo.resize(pos+1);
|
||||||
{
|
|
||||||
ClearList();
|
|
||||||
filecount = 0;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
FileInfo = TempFileInfo;
|
FileInfo[pos].FilePath = new (std::nothrow) char[strlen(folderpath)+strlen(filename)+1];
|
||||||
|
if(FileInfo[pos].FilePath)
|
||||||
memset(&(FileInfo[filecount]), 0, sizeof(FileInfo));
|
sprintf(FileInfo[pos].FilePath, "%s/%s", folderpath, filename);
|
||||||
|
FileInfo[pos].FileSize = filesize;
|
||||||
FileInfo[filecount].FilePath = strdup(folderpath);
|
FileInfo[pos].isDir = isDir;
|
||||||
FileInfo[filecount].FileName = strdup(filename);
|
|
||||||
FileInfo[filecount].FileSize = filesize;
|
|
||||||
FileInfo[filecount].isDir = isDir;
|
|
||||||
|
|
||||||
if (!FileInfo[filecount].FilePath || !FileInfo[filecount].FileName)
|
|
||||||
{
|
|
||||||
ClearList();
|
|
||||||
filecount = 0;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
filecount++;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DirList::ClearList()
|
void DirList::ClearList()
|
||||||
{
|
{
|
||||||
for(int i = 0; i < filecount; i++)
|
for(u32 i = 0; i < FileInfo.size(); ++i)
|
||||||
{
|
{
|
||||||
if(FileInfo[i].FilePath)
|
if(FileInfo[i].FilePath)
|
||||||
{
|
delete [] FileInfo[i].FilePath;
|
||||||
free(FileInfo[i].FilePath);
|
|
||||||
FileInfo[i].FilePath = NULL;
|
|
||||||
}
|
|
||||||
if(FileInfo[i].FileName)
|
|
||||||
{
|
|
||||||
free(FileInfo[i].FileName);
|
|
||||||
FileInfo[i].FileName = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FileInfo)
|
FileInfo.clear();
|
||||||
{
|
std::vector<FileInfos>().swap(FileInfo);
|
||||||
free(FileInfo);
|
|
||||||
FileInfo = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char *DirList::GetFilename(int ind)
|
const char * DirList::GetFilename(int ind)
|
||||||
{
|
{
|
||||||
if (ind >= filecount || ind < 0)
|
if (!valid(ind))
|
||||||
return NULL;
|
return NULL;
|
||||||
else
|
|
||||||
return FileInfo[ind].FileName;
|
return FullpathToFilename(FileInfo[ind].FilePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *DirList::GetFilepath(int ind)
|
static bool SortCallback(const FileInfos & f1, const FileInfos & f2)
|
||||||
{
|
{
|
||||||
if (ind >= filecount || ind < 0)
|
if(f1.isDir && !(f2.isDir)) return true;
|
||||||
return NULL;
|
if(!(f1.isDir) && f2.isDir) return false;
|
||||||
else
|
|
||||||
return FileInfo[ind].FilePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int DirList::GetFilesize(int ind)
|
const char * Filename1 = FullpathToFilename(f1.FilePath);
|
||||||
{
|
const char * Filename2 = FullpathToFilename(f2.FilePath);
|
||||||
if (ind >= filecount || !filecount || !FileInfo)
|
|
||||||
return 0;
|
|
||||||
else
|
|
||||||
return FileInfo[ind].FileSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DirList::IsDir(int ind)
|
if(Filename1 && !Filename2) return true;
|
||||||
{
|
if(!Filename1 && Filename2) return false;
|
||||||
if (ind >= filecount || !filecount || !FileInfo)
|
|
||||||
|
if(strcasecmp(Filename1, Filename2) > 0)
|
||||||
return false;
|
return false;
|
||||||
else
|
|
||||||
return FileInfo[ind].isDir;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ListCompare(const void *a, const void *b)
|
return true;
|
||||||
{
|
|
||||||
FileInfos *ab = (FileInfos*) a;
|
|
||||||
FileInfos *bb = (FileInfos*) b;
|
|
||||||
|
|
||||||
return stricmp((char *) ab->FileName, (char *) bb->FileName);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DirList::SortList()
|
void DirList::SortList()
|
||||||
{
|
{
|
||||||
if(!FileInfo)
|
std::sort(FileInfo.begin(), FileInfo.end(), SortCallback);
|
||||||
return;
|
|
||||||
|
|
||||||
qsort(FileInfo, filecount, sizeof(FileInfos), ListCompare);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int DirList::GetFileIndex(const char *filename)
|
int DirList::GetFileIndex(const char *filename)
|
||||||
{
|
{
|
||||||
if(!filename || !FileInfo)
|
if(!filename)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (int i = 0; i < filecount; i++)
|
for (u32 i = 0; i < FileInfo.size(); ++i)
|
||||||
{
|
{
|
||||||
if (strcasecmp(FileInfo[i].FileName, filename) == 0)
|
if (strcasecmp(GetFilename(i), filename) == 0)
|
||||||
{
|
|
||||||
return i;
|
return i;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,40 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
* Copyright (C) 2010
|
||||||
|
* by Dimok
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any
|
||||||
|
* damages arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any
|
||||||
|
* purpose, including commercial applications, and to alter it and
|
||||||
|
* redistribute it freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you
|
||||||
|
* must not claim that you wrote the original software. If you use
|
||||||
|
* this software in a product, an acknowledgment in the product
|
||||||
|
* documentation would be appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and
|
||||||
|
* must not be misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
* DirList Class
|
* DirList Class
|
||||||
* for WiiXplorer
|
* for WiiXplorer 2010
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
#ifndef ___DIRLIST_H_
|
#ifndef ___DIRLIST_H_
|
||||||
#define ___DIRLIST_H_
|
#define ___DIRLIST_H_
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
#include <gctypes.h>
|
#include <gctypes.h>
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
char *FileName;
|
char * FilePath;
|
||||||
char *FilePath;
|
u64 FileSize;
|
||||||
u64 FileSize;
|
bool isDir;
|
||||||
bool isDir;
|
|
||||||
} FileInfos;
|
} FileInfos;
|
||||||
|
|
||||||
class DirList
|
class DirList
|
||||||
@ -21,38 +43,46 @@ class DirList
|
|||||||
//!Constructor
|
//!Constructor
|
||||||
//!\param path Path from where to load the filelist of all files
|
//!\param path Path from where to load the filelist of all files
|
||||||
//!\param filter A fileext that needs to be filtered
|
//!\param filter A fileext that needs to be filtered
|
||||||
DirList(const char * path, const char *filter = NULL);
|
//!\param flags search/filter flags from the enum
|
||||||
|
DirList(const char * path, const char *filter = NULL, u32 flags = Files | Dirs);
|
||||||
//!Destructor
|
//!Destructor
|
||||||
~DirList();
|
~DirList();
|
||||||
//! Load all the files from a directory
|
//! Load all the files from a directory
|
||||||
//!\param path Path where to check for homebrew files
|
bool LoadPath(const char * path, const char *filter = NULL, u32 flags = Files | Dirs);
|
||||||
bool LoadPath(const char * path, const char *filter = NULL);
|
|
||||||
//! Get a filename of the list
|
//! Get a filename of the list
|
||||||
//!\param list index
|
//!\param list index
|
||||||
char * GetFilename(int index);
|
const char * GetFilename(int index);
|
||||||
//! Get the a filepath of the list
|
//! Get the a filepath of the list
|
||||||
//!\param list index
|
//!\param list index
|
||||||
char * GetFilepath(int index);
|
const char * GetFilepath(int index) { if(!valid(index)) return NULL; return FileInfo[index].FilePath; };
|
||||||
//! Get the a filesize of the list
|
//! Get the a filesize of the list
|
||||||
//!\param list index
|
//!\param list index
|
||||||
unsigned int GetFilesize(int index);
|
u64 GetFilesize(int index) { if(!valid(index)) return 0; return FileInfo[index].FileSize; };
|
||||||
//! Is index a dir or a file
|
//! Is index a dir or a file
|
||||||
//!\param list index
|
//!\param list index
|
||||||
bool IsDir(int index);
|
bool IsDir(int index) { if(!valid(index)) return 0; return FileInfo[index].isDir; };
|
||||||
//! Get the filecount of the whole list
|
//! Get the filecount of the whole list
|
||||||
int GetFilecount() { return filecount; };
|
int GetFilecount() { return FileInfo.size(); };
|
||||||
//! Sort list by filepath
|
//! Sort list by filepath
|
||||||
void SortList();
|
void SortList();
|
||||||
//! Get the index of the specified filename
|
//! Get the index of the specified filename
|
||||||
int GetFileIndex(const char *filename);
|
int GetFileIndex(const char *filename);
|
||||||
|
//! Enum for search/filter flags
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
Files = 0x01,
|
||||||
|
Dirs = 0x02,
|
||||||
|
CheckSubfolders = 0x08,
|
||||||
|
};
|
||||||
protected:
|
protected:
|
||||||
//!Add a list entrie
|
//!Add a list entrie
|
||||||
bool AddEntrie(const char * folderpath, const char * filename, u64 filesize, bool isDir);
|
void AddEntrie(const char * folderpath, const char * filename, u64 filesize, bool isDir);
|
||||||
//! Clear the list
|
//! Clear the list
|
||||||
void ClearList();
|
void ClearList();
|
||||||
|
//! Check if valid pos is requested
|
||||||
|
inline bool valid(int pos) { return (pos >= 0 && pos < (int) FileInfo.size()); };
|
||||||
|
|
||||||
int filecount;
|
std::vector<FileInfos> FileInfo;
|
||||||
FileInfos *FileInfo;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -21,7 +21,7 @@ void gprintf(const char *format, ...)
|
|||||||
if((vasprintf(&tmp, format, va) >= 0) && tmp)
|
if((vasprintf(&tmp, format, va) >= 0) && tmp)
|
||||||
{
|
{
|
||||||
u32 level = IRQ_Disable();
|
u32 level = IRQ_Disable();
|
||||||
usb_sendbuffer_safe(1, tmp, strlen(tmp));
|
usb_sendbuffer(1, tmp, strlen(tmp));
|
||||||
IRQ_Restore(level);
|
IRQ_Restore(level);
|
||||||
}
|
}
|
||||||
va_end(va);
|
va_end(va);
|
||||||
|
@ -8,69 +8,131 @@
|
|||||||
#include <sys/dir.h>
|
#include <sys/dir.h>
|
||||||
|
|
||||||
#include "UpdateLanguage.h"
|
#include "UpdateLanguage.h"
|
||||||
|
#include "gettext.h"
|
||||||
#include "FileOperations/fileops.h"
|
#include "FileOperations/fileops.h"
|
||||||
#include "FileOperations/DirList.h"
|
#include "FileOperations/DirList.h"
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
#include "network/networkops.h"
|
#include "network/networkops.h"
|
||||||
#include "network/http.h"
|
#include "network/http.h"
|
||||||
|
#include "network/URL_List.h"
|
||||||
|
#include "prompts/ProgressWindow.h"
|
||||||
|
#include "utils/ShowError.h"
|
||||||
|
#include "gecko.h"
|
||||||
|
|
||||||
int updateLanguageFiles()
|
static const char * LanguageFilesURL = "http://usbloader-gui.googlecode.com/svn/trunk/Languages/";
|
||||||
|
|
||||||
|
int DownloadAllLanguageFiles()
|
||||||
{
|
{
|
||||||
char languageFiles[50][MAXLANGUAGEFILES];
|
if(!CreateSubfolder(Settings.languagefiles_path))
|
||||||
|
{
|
||||||
|
ShowError(tr("Could not create path: %s"), Settings.languagefiles_path);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
DirList Dir(Settings.languagefiles_path);
|
if(!IsNetworkInit())
|
||||||
|
{
|
||||||
|
ShowError(tr("Network is not initiated."));
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
char fullURL[300];
|
||||||
|
|
||||||
|
URL_List LinkList(LanguageFilesURL);
|
||||||
|
int listsize = LinkList.GetURLCount();
|
||||||
|
int files_downloaded = 0;
|
||||||
|
|
||||||
|
ShowProgress(tr("Updating Language Files:"), 0, 0, 0, listsize, false, true);
|
||||||
|
|
||||||
|
for (int i = 0; i < listsize; i++)
|
||||||
|
{
|
||||||
|
const char * filename = strrchr(LinkList.GetURL(i), '/');
|
||||||
|
if(filename) filename++;
|
||||||
|
else filename = LinkList.GetURL(i);
|
||||||
|
|
||||||
|
if(!filename)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const char * FileExt = strrchr(filename, '.');
|
||||||
|
if (!FileExt || strcasecmp(FileExt, ".lang") != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
gprintf("%s\n", filename);
|
||||||
|
|
||||||
|
ShowProgress(tr("Updating Language Files:"), 0, filename, i, listsize, false, true);
|
||||||
|
|
||||||
|
snprintf(fullURL, sizeof(fullURL), "%s%s", LanguageFilesURL, filename);
|
||||||
|
|
||||||
|
struct block file = downloadfile(fullURL);
|
||||||
|
if (file.data)
|
||||||
|
{
|
||||||
|
char filepath[300];
|
||||||
|
snprintf(filepath, sizeof(filepath), "%s/%s", Settings.languagefiles_path, filename);
|
||||||
|
FILE * pfile = fopen(filepath, "wb");
|
||||||
|
if(pfile)
|
||||||
|
{
|
||||||
|
fwrite(file.data, 1, file.size, pfile);
|
||||||
|
fclose(pfile);
|
||||||
|
files_downloaded++;
|
||||||
|
}
|
||||||
|
free(file.data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ProgressStop();
|
||||||
|
|
||||||
|
return files_downloaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
int UpdateLanguageFiles()
|
||||||
|
{
|
||||||
|
if(!CreateSubfolder(Settings.languagefiles_path))
|
||||||
|
{
|
||||||
|
ShowError(tr("Could not create path: %s"), Settings.languagefiles_path);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!IsNetworkInit())
|
||||||
|
{
|
||||||
|
ShowError(tr("Network is not initiated."));
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
DirList Dir(Settings.languagefiles_path, ".lang");
|
||||||
|
|
||||||
//give up now if we didn't find any
|
//give up now if we didn't find any
|
||||||
if (Dir.GetFilecount() == 0) return -2;
|
if (Dir.GetFilecount() == 0) return -2;
|
||||||
|
|
||||||
//now from the files we got, get only the .lang files
|
char savepath[150];
|
||||||
for (int cnt = 0; cnt < Dir.GetFilecount(); cnt++)
|
char codeurl[200];
|
||||||
{
|
|
||||||
char filename[64];
|
|
||||||
strlcpy(filename, Dir.GetFilename(cnt), sizeof(filename));
|
|
||||||
if (strcasestr(filename, ".lang"))
|
|
||||||
{
|
|
||||||
strcpy(languageFiles[cnt], filename);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CreateSubfolder(Settings.languagefiles_path);
|
|
||||||
|
|
||||||
//we assume that the network will already be init by another function
|
//we assume that the network will already be init by another function
|
||||||
// ( that has gui eletents in it because this one doesn't)
|
// ( that has gui eletents in it because this one doesn't)
|
||||||
int done = 0, j = 0;
|
int done = 0;
|
||||||
if (IsNetworkInit())
|
|
||||||
|
//build the URL, save path, and download each file and save it
|
||||||
|
for(int i = 0; i < Dir.GetFilecount(); ++i)
|
||||||
{
|
{
|
||||||
//build the URL, save path, and download each file and save it
|
snprintf(codeurl, sizeof(codeurl), "%s%s", LanguageFilesURL, Dir.GetFilename(i));
|
||||||
while (j < Dir.GetFilecount())
|
snprintf(savepath, sizeof(savepath), "%s/%s", Settings.languagefiles_path, Dir.GetFilename(i));
|
||||||
|
|
||||||
|
struct block file = downloadfile(codeurl);
|
||||||
|
|
||||||
|
ShowProgress(tr("Updating Language Files:"), 0, Dir.GetFilename(i), i, Dir.GetFilecount(), false, true);
|
||||||
|
|
||||||
|
if (file.data != NULL)
|
||||||
{
|
{
|
||||||
char savepath[150];
|
FILE * pfile;
|
||||||
char codeurl[200];
|
pfile = fopen(savepath, "wb");
|
||||||
snprintf(codeurl, sizeof(codeurl), "http://usbloader-gui.googlecode.com/svn/trunk/Languages/%s",
|
if (pfile != NULL)
|
||||||
languageFiles[j]);
|
|
||||||
snprintf(savepath, sizeof(savepath), "%s/%s", Settings.languagefiles_path, languageFiles[j]);
|
|
||||||
|
|
||||||
struct block file = downloadfile(codeurl);
|
|
||||||
|
|
||||||
if (file.data != NULL)
|
|
||||||
{
|
{
|
||||||
FILE * pfile;
|
fwrite(file.data, 1, file.size, pfile);
|
||||||
pfile = fopen(savepath, "wb");
|
fclose(pfile);
|
||||||
if (pfile != NULL)
|
done++;
|
||||||
{
|
|
||||||
fwrite(file.data, 1, file.size, pfile);
|
|
||||||
fclose(pfile);
|
|
||||||
free(file.data);
|
|
||||||
done++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
free(file.data);
|
||||||
j++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
//if there was no network init
|
|
||||||
else return -1;
|
ProgressStop();
|
||||||
|
|
||||||
// return the number of files we updated
|
// return the number of files we updated
|
||||||
return done;
|
return done;
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
//! returns the number of files successfully updated
|
//! returns the number of files successfully updated
|
||||||
//! returns -2 if it can't find any .lang files in the path
|
//! returns -2 if it can't find any .lang files in the path
|
||||||
//! return -1 if there is no network connection
|
//! return -1 if there is no network connection
|
||||||
int updateLanguageFiles();
|
int UpdateLanguageFiles();
|
||||||
|
int DownloadAllLanguageFiles();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -54,10 +54,6 @@ char game_partition[6];
|
|||||||
int load_from_fs;
|
int load_from_fs;
|
||||||
|
|
||||||
/*** Variables used only in the menus ***/
|
/*** Variables used only in the menus ***/
|
||||||
GuiText * GameIDTxt = NULL;
|
|
||||||
GuiText * GameRegionTxt = NULL;
|
|
||||||
GuiImage * coverImg = NULL;
|
|
||||||
GuiImageData * cover = NULL;
|
|
||||||
bool altdoldefault = true;
|
bool altdoldefault = true;
|
||||||
|
|
||||||
static lwp_t guithread = LWP_THREAD_NULL;
|
static lwp_t guithread = LWP_THREAD_NULL;
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "usbloader/wdvd.h"
|
#include "usbloader/wdvd.h"
|
||||||
#include "usbloader/GameList.h"
|
#include "usbloader/GameList.h"
|
||||||
#include "network/networkops.h"
|
#include "network/networkops.h"
|
||||||
|
#include "network/update.h"
|
||||||
#include "network/CoverDownload.h"
|
#include "network/CoverDownload.h"
|
||||||
#include "FileOperations/fileops.h"
|
#include "FileOperations/fileops.h"
|
||||||
#include "settings/Settings.h"
|
#include "settings/Settings.h"
|
||||||
@ -39,7 +40,9 @@ GameBrowseMenu::GameBrowseMenu()
|
|||||||
: GuiWindow(screenwidth, screenheight)
|
: GuiWindow(screenwidth, screenheight)
|
||||||
{
|
{
|
||||||
float freespace = 0.0, used = 0.0;
|
float freespace = 0.0, used = 0.0;
|
||||||
|
returnMenu = MENU_NONE;
|
||||||
gameSelectedOld = -1;
|
gameSelectedOld = -1;
|
||||||
|
lastrawtime = 0;
|
||||||
show_searchwindow = false;
|
show_searchwindow = false;
|
||||||
gameBrowser = NULL;
|
gameBrowser = NULL;
|
||||||
gameGrid = NULL;
|
gameGrid = NULL;
|
||||||
@ -50,7 +53,6 @@ GameBrowseMenu::GameBrowseMenu()
|
|||||||
GameIDTxt = NULL;
|
GameIDTxt = NULL;
|
||||||
GameRegionTxt = NULL;
|
GameRegionTxt = NULL;
|
||||||
ScreensaverTimer = 0;
|
ScreensaverTimer = 0;
|
||||||
memset(theTime, 0, sizeof(theTime));
|
|
||||||
WDVD_GetCoverStatus(&DiscDriveCoverOld);
|
WDVD_GetCoverStatus(&DiscDriveCoverOld);
|
||||||
wString oldFilter(gameList.GetCurrentFilter());
|
wString oldFilter(gameList.GetCurrentFilter());
|
||||||
gameList.FilterList(oldFilter.c_str());
|
gameList.FilterList(oldFilter.c_str());
|
||||||
@ -265,7 +267,7 @@ GameBrowseMenu::GameBrowseMenu()
|
|||||||
dvdBtnTT->SetAlpha(Theme.tooltipAlpha);
|
dvdBtnTT->SetAlpha(Theme.tooltipAlpha);
|
||||||
dvdBtnImg = new GuiImage(imgdvd);
|
dvdBtnImg = new GuiImage(imgdvd);
|
||||||
dvdBtnImg->SetWidescreen(Settings.widescreen);
|
dvdBtnImg->SetWidescreen(Settings.widescreen);
|
||||||
dvdBtnImg_g = new GuiImage(dvdBtnImg);
|
dvdBtnImg_g = new GuiImage(imgdvd_gray);
|
||||||
dvdBtnImg_g->SetWidescreen(Settings.widescreen);
|
dvdBtnImg_g->SetWidescreen(Settings.widescreen);
|
||||||
dvdBtn = new GuiButton(dvdBtnImg_g, dvdBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_dvd_x, Theme.gamelist_dvd_y,
|
dvdBtn = new GuiButton(dvdBtnImg_g, dvdBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_dvd_x, Theme.gamelist_dvd_y,
|
||||||
trigA, btnSoundOver, btnSoundClick2, 1, dvdBtnTT, 15, 52, 1, 3);
|
trigA, btnSoundOver, btnSoundClick2, 1, dvdBtnTT, 15, 52, 1, 3);
|
||||||
@ -299,7 +301,7 @@ GameBrowseMenu::GameBrowseMenu()
|
|||||||
clockTimeBack->SetPosition(Theme.clock_x, Theme.clock_y);
|
clockTimeBack->SetPosition(Theme.clock_x, Theme.clock_y);
|
||||||
clockTimeBack->SetFont(clock_ttf, clock_ttf_size);
|
clockTimeBack->SetFont(clock_ttf, clock_ttf_size);
|
||||||
|
|
||||||
clockTime = new GuiText(theTime, 40, Theme.clock);
|
clockTime = new GuiText("", 40, Theme.clock);
|
||||||
clockTime->SetAlignment(Theme.clock_align, ALIGN_TOP);
|
clockTime->SetAlignment(Theme.clock_align, ALIGN_TOP);
|
||||||
clockTime->SetPosition(Theme.clock_x, Theme.clock_y);
|
clockTime->SetPosition(Theme.clock_x, Theme.clock_y);
|
||||||
clockTime->SetFont(clock_ttf, clock_ttf_size);
|
clockTime->SetFont(clock_ttf, clock_ttf_size);
|
||||||
@ -488,6 +490,11 @@ void GameBrowseMenu::ReloadBrowser()
|
|||||||
sortBtnTT->SetText(sortTTText);
|
sortBtnTT->SetText(sortTTText);
|
||||||
sortBtnImg->SetImage(sortImgData);
|
sortBtnImg->SetImage(sortImgData);
|
||||||
|
|
||||||
|
if(DiscDriveCoverOld & 0x02)
|
||||||
|
dvdBtn->SetImage(dvdBtnImg);
|
||||||
|
else
|
||||||
|
dvdBtn->SetImage(dvdBtnImg_g);
|
||||||
|
|
||||||
if (Settings.GameSort & SORT_FAVORITE)
|
if (Settings.GameSort & SORT_FAVORITE)
|
||||||
{
|
{
|
||||||
favoriteBtn->SetImage(favoriteBtnImg);
|
favoriteBtn->SetImage(favoriteBtnImg);
|
||||||
@ -707,39 +714,14 @@ int GameBrowseMenu::Show()
|
|||||||
|
|
||||||
int GameBrowseMenu::MainLoop()
|
int GameBrowseMenu::MainLoop()
|
||||||
{
|
{
|
||||||
WDVD_GetCoverStatus(&DiscDriveCover);//for detecting if i disc has been inserted
|
UpdateClock();
|
||||||
|
CheckDiscSlotUpdate();
|
||||||
//CLOCK
|
|
||||||
if (Settings.hddinfo == CLOCK_HR12 || Settings.hddinfo == CLOCK_HR24)
|
|
||||||
{
|
|
||||||
time_t rawtime = time(0);
|
|
||||||
if(rawtime != lastrawtime)
|
|
||||||
{
|
|
||||||
lastrawtime = rawtime;
|
|
||||||
struct tm * timeinfo = localtime(&rawtime);
|
|
||||||
if (Settings.hddinfo == CLOCK_HR12)
|
|
||||||
{
|
|
||||||
if (rawtime & 1)
|
|
||||||
strftime(theTime, sizeof(theTime), "%I:%M", timeinfo);
|
|
||||||
else
|
|
||||||
strftime(theTime, sizeof(theTime), "%I %M", timeinfo);
|
|
||||||
}
|
|
||||||
if (Settings.hddinfo == CLOCK_HR24)
|
|
||||||
{
|
|
||||||
if (rawtime & 1)
|
|
||||||
strftime(theTime, sizeof(theTime), "%H:%M", timeinfo);
|
|
||||||
else
|
|
||||||
strftime(theTime, sizeof(theTime), "%H %M", timeinfo);
|
|
||||||
}
|
|
||||||
clockTime->SetText(theTime);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (updateavailable == true)
|
if (updateavailable == true)
|
||||||
{
|
{
|
||||||
gprintf("\tUpdate Available\n");
|
gprintf("\tUpdate Available\n");
|
||||||
SetState(STATE_DISABLED);
|
SetState(STATE_DISABLED);
|
||||||
ProgressUpdateWindow();
|
UpdateApp();
|
||||||
updateavailable = false;
|
updateavailable = false;
|
||||||
SetState(STATE_DEFAULT);
|
SetState(STATE_DEFAULT);
|
||||||
}
|
}
|
||||||
@ -791,16 +773,6 @@ int GameBrowseMenu::MainLoop()
|
|||||||
|
|
||||||
installBtn->ResetState();
|
installBtn->ResetState();
|
||||||
}
|
}
|
||||||
else if ((DiscDriveCover & 0x02) && (DiscDriveCover != DiscDriveCoverOld))
|
|
||||||
{
|
|
||||||
gprintf("\tNew Disc Detected\n");
|
|
||||||
int choice = WindowPrompt(tr( "New Disc Detected" ), 0, tr( "Install" ), tr( "Mount DVD drive" ), tr( "Cancel" ));
|
|
||||||
if (choice == 1)
|
|
||||||
return MENU_INSTALL;
|
|
||||||
else if (choice == 2)
|
|
||||||
dvdBtn->SetState(STATE_CLICKED);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (sdcardBtn->GetState() == STATE_CLICKED)
|
else if (sdcardBtn->GetState() == STATE_CLICKED)
|
||||||
{
|
{
|
||||||
gprintf("\tsdCardBtn Clicked\n");
|
gprintf("\tsdCardBtn Clicked\n");
|
||||||
@ -1013,16 +985,6 @@ int GameBrowseMenu::MainLoop()
|
|||||||
WindowPrompt(tr( "Parental Control" ), tr( "Invalid PIN code" ), tr( "OK" ));
|
WindowPrompt(tr( "Parental Control" ), tr( "Invalid PIN code" ), tr( "OK" ));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (dvdBtn->GetState() == STATE_CLICKED)
|
|
||||||
{
|
|
||||||
gprintf("\tdvdBtn Clicked\n");
|
|
||||||
if(!dvdheader)
|
|
||||||
dvdheader = new struct discHdr;
|
|
||||||
mountMethod = DiscMount(dvdheader);
|
|
||||||
dvdBtn->ResetState();
|
|
||||||
|
|
||||||
rockout(GetSelectedGame());
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (Settings.gameDisplay == LIST_MODE && idBtn->GetState() == STATE_CLICKED)
|
else if (Settings.gameDisplay == LIST_MODE && idBtn->GetState() == STATE_CLICKED)
|
||||||
{
|
{
|
||||||
@ -1043,7 +1005,7 @@ int GameBrowseMenu::MainLoop()
|
|||||||
idBtn->ResetState();
|
idBtn->ResetState();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Settings.gameDisplay == LIST_MODE && GetSelectedGame() != gameSelectedOld)
|
else if (Settings.gameDisplay == LIST_MODE && GetSelectedGame() != gameSelectedOld)
|
||||||
{
|
{
|
||||||
gameSelectedOld = GetSelectedGame();
|
gameSelectedOld = GetSelectedGame();
|
||||||
int gameSelected = gameSelectedOld;
|
int gameSelected = gameSelectedOld;
|
||||||
@ -1072,9 +1034,74 @@ int GameBrowseMenu::MainLoop()
|
|||||||
else
|
else
|
||||||
ScreensaverTimer = 0;
|
ScreensaverTimer = 0;
|
||||||
|
|
||||||
DiscDriveCoverOld = DiscDriveCover;
|
return returnMenu;
|
||||||
|
}
|
||||||
|
|
||||||
return MENU_NONE;
|
void GameBrowseMenu::CheckDiscSlotUpdate()
|
||||||
|
{
|
||||||
|
u32 DiscDriveCover;
|
||||||
|
WDVD_GetCoverStatus(&DiscDriveCover);//for detecting if i disc has been inserted
|
||||||
|
|
||||||
|
if ((DiscDriveCover & 0x02) && (DiscDriveCover != DiscDriveCoverOld))
|
||||||
|
{
|
||||||
|
gprintf("\tNew Disc Detected\n");
|
||||||
|
int choice = WindowPrompt(tr( "New Disc Detected" ), 0, tr( "Install" ), tr( "Mount DVD drive" ), tr( "Cancel" ));
|
||||||
|
if (choice == 1)
|
||||||
|
returnMenu = MENU_INSTALL;
|
||||||
|
else if (choice == 2)
|
||||||
|
dvdBtn->SetState(STATE_CLICKED);
|
||||||
|
}
|
||||||
|
else if (dvdBtn->GetState() == STATE_CLICKED)
|
||||||
|
{
|
||||||
|
gprintf("\tdvdBtn Clicked\n");
|
||||||
|
if(!dvdheader)
|
||||||
|
dvdheader = new struct discHdr;
|
||||||
|
mountMethod = DiscMount(dvdheader);
|
||||||
|
dvdBtn->ResetState();
|
||||||
|
|
||||||
|
rockout(GetSelectedGame());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(DiscDriveCoverOld != DiscDriveCover)
|
||||||
|
{
|
||||||
|
if(DiscDriveCover & 0x02)
|
||||||
|
dvdBtn->SetImage(dvdBtnImg);
|
||||||
|
else
|
||||||
|
dvdBtn->SetImage(dvdBtnImg_g);
|
||||||
|
|
||||||
|
DiscDriveCoverOld = DiscDriveCover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GameBrowseMenu::UpdateClock()
|
||||||
|
{
|
||||||
|
if(Settings.hddinfo != CLOCK_HR12 && Settings.hddinfo != CLOCK_HR24)
|
||||||
|
return;
|
||||||
|
|
||||||
|
time_t rawtime = time(0);
|
||||||
|
if(rawtime == lastrawtime) //! Only update every 1 second
|
||||||
|
return;
|
||||||
|
|
||||||
|
char theTime[50];
|
||||||
|
theTime[0] = 0;
|
||||||
|
|
||||||
|
lastrawtime = rawtime;
|
||||||
|
struct tm * timeinfo = localtime(&rawtime);
|
||||||
|
if (Settings.hddinfo == CLOCK_HR12)
|
||||||
|
{
|
||||||
|
if (rawtime & 1)
|
||||||
|
strftime(theTime, sizeof(theTime), "%I:%M", timeinfo);
|
||||||
|
else
|
||||||
|
strftime(theTime, sizeof(theTime), "%I %M", timeinfo);
|
||||||
|
}
|
||||||
|
if (Settings.hddinfo == CLOCK_HR24)
|
||||||
|
{
|
||||||
|
if (rawtime & 1)
|
||||||
|
strftime(theTime, sizeof(theTime), "%H:%M", timeinfo);
|
||||||
|
else
|
||||||
|
strftime(theTime, sizeof(theTime), "%H %M", timeinfo);
|
||||||
|
}
|
||||||
|
clockTime->SetText(theTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
int GameBrowseMenu::GetSelectedGame()
|
int GameBrowseMenu::GetSelectedGame()
|
||||||
@ -1263,6 +1290,8 @@ int GameBrowseMenu::OpenClickedGame()
|
|||||||
returnHere = true;
|
returnHere = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mountMethod = 0;
|
||||||
|
|
||||||
if (searchBar)
|
if (searchBar)
|
||||||
{
|
{
|
||||||
HaltGui();
|
HaltGui();
|
||||||
|
@ -23,6 +23,8 @@ class GameBrowseMenu : public GuiWindow
|
|||||||
void LoadCover(struct discHdr *header);
|
void LoadCover(struct discHdr *header);
|
||||||
void CheckAlternativeDOL(const char * IDfull);
|
void CheckAlternativeDOL(const char * IDfull);
|
||||||
void CheckOcarina(const char * IDfull);
|
void CheckOcarina(const char * IDfull);
|
||||||
|
void CheckDiscSlotUpdate();
|
||||||
|
void UpdateClock();
|
||||||
static void UpdateCallback(void * e);
|
static void UpdateCallback(void * e);
|
||||||
|
|
||||||
GuiImageData * btnInstall;
|
GuiImageData * btnInstall;
|
||||||
@ -98,6 +100,8 @@ class GameBrowseMenu : public GuiWindow
|
|||||||
GuiText * gamecntTxt;
|
GuiText * gamecntTxt;
|
||||||
GuiText * clockTimeBack;
|
GuiText * clockTimeBack;
|
||||||
GuiText * clockTime;
|
GuiText * clockTime;
|
||||||
|
GuiText * GameRegionTxt;
|
||||||
|
GuiText * GameIDTxt;
|
||||||
|
|
||||||
GuiButton * gamecntBtn;
|
GuiButton * gamecntBtn;
|
||||||
GuiButton * installBtn;
|
GuiButton * installBtn;
|
||||||
@ -139,9 +143,8 @@ class GameBrowseMenu : public GuiWindow
|
|||||||
GuiGameGrid * gameGrid;
|
GuiGameGrid * gameGrid;
|
||||||
GuiGameCarousel * gameCarousel;
|
GuiGameCarousel * gameCarousel;
|
||||||
GuiSearchBar * searchBar;
|
GuiSearchBar * searchBar;
|
||||||
char theTime[50];
|
|
||||||
u32 DiscDriveCover;
|
|
||||||
u32 DiscDriveCoverOld;
|
u32 DiscDriveCoverOld;
|
||||||
|
int returnMenu;
|
||||||
int gameSelectedOld;
|
int gameSelectedOld;
|
||||||
int gameClicked;
|
int gameClicked;
|
||||||
time_t lastrawtime;
|
time_t lastrawtime;
|
||||||
|
@ -24,7 +24,7 @@ static void AbortCallback(void)
|
|||||||
AbortRequested = true;
|
AbortRequested = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int CoverDownloadWithProgress(const char * url, const char * writepath, std::vector<std::string> & MissingFilesList)
|
static int CoverDownloadWithProgress(const char * url, const char * progressTitle, const char * writepath, std::vector<std::string> & MissingFilesList)
|
||||||
{
|
{
|
||||||
if(!url || !writepath)
|
if(!url || !writepath)
|
||||||
return -1;
|
return -1;
|
||||||
@ -38,7 +38,7 @@ static int CoverDownloadWithProgress(const char * url, const char * writepath, s
|
|||||||
char downloadURL[512];
|
char downloadURL[512];
|
||||||
char progressMsg[255];
|
char progressMsg[255];
|
||||||
int FilesSkipped = MissingFilesList.size();
|
int FilesSkipped = MissingFilesList.size();
|
||||||
ProgressSetAbortCallback((ProgressAbortCallback) AbortCallback);
|
ProgressSetAbortCallback(AbortCallback);
|
||||||
|
|
||||||
for(u32 i = 0; i < MissingFilesList.size(); ++i)
|
for(u32 i = 0; i < MissingFilesList.size(); ++i)
|
||||||
{
|
{
|
||||||
@ -47,9 +47,9 @@ static int CoverDownloadWithProgress(const char * url, const char * writepath, s
|
|||||||
|
|
||||||
snprintf(progressMsg, sizeof(progressMsg), "http://wiitdb.com : %s.png", MissingFilesList[i].c_str());
|
snprintf(progressMsg, sizeof(progressMsg), "http://wiitdb.com : %s.png", MissingFilesList[i].c_str());
|
||||||
|
|
||||||
ShowProgress(tr("Downloading files"), fmt("%i %s", MissingFilesList.size() - i, tr( "files left" )), progressMsg, i, MissingFilesList.size());
|
ShowProgress(progressTitle, fmt("%i %s", MissingFilesList.size() - i, tr( "files left" )), progressMsg, i, MissingFilesList.size());
|
||||||
|
|
||||||
if(MissingFilesList[i].size() < 6)
|
if(MissingFilesList[i].size() < 4)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
//Creates URL depending from which Country the game is
|
//Creates URL depending from which Country the game is
|
||||||
@ -98,7 +98,7 @@ static int CoverDownloadWithProgress(const char * url, const char * writepath, s
|
|||||||
}
|
}
|
||||||
|
|
||||||
char imgPath[200];
|
char imgPath[200];
|
||||||
snprintf(imgPath, sizeof(imgPath), "%s%s.png", writepath, MissingFilesList[i].c_str());
|
snprintf(imgPath, sizeof(imgPath), "%s/%s.png", writepath, MissingFilesList[i].c_str());
|
||||||
|
|
||||||
FILE *pfile = fopen(imgPath, "wb");
|
FILE *pfile = fopen(imgPath, "wb");
|
||||||
if (pfile != NULL)
|
if (pfile != NULL)
|
||||||
@ -125,6 +125,13 @@ void CoverDownload()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
const char * writepath = choice == 1 ? Settings.covers_path : choice == 2 ? Settings.covers2d_path : Settings.disc_path;
|
const char * writepath = choice == 1 ? Settings.covers_path : choice == 2 ? Settings.covers2d_path : Settings.disc_path;
|
||||||
|
const char * downloadURL = choice == 1 ? serverURL3D : choice == 2 ? serverURL2D : NULL;
|
||||||
|
const char * progressTitle = choice != 3 ? tr("Downloading covers") : NULL;
|
||||||
|
if(choice == 3)
|
||||||
|
{
|
||||||
|
downloadURL = (Settings.discart == 0 || Settings.discart == 2) ? serverURLOrigDiscs : serverURLCustomDiscs;
|
||||||
|
progressTitle = (Settings.discart == 0 || Settings.discart == 2) ? tr("Downloading original Discarts") : tr("Downloading custom Discarts");
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<std::string> MissingFilesList;
|
std::vector<std::string> MissingFilesList;
|
||||||
GetMissingGameFiles(writepath, ".png", MissingFilesList);
|
GetMissingGameFiles(writepath, ".png", MissingFilesList);
|
||||||
@ -148,24 +155,23 @@ void CoverDownload()
|
|||||||
|
|
||||||
AbortRequested = false;
|
AbortRequested = false;
|
||||||
|
|
||||||
const char * downloadURL = choice == 1 ? serverURL3D : choice == 2 ? serverURL2D : NULL;
|
int FileSkipped = CoverDownloadWithProgress(downloadURL, progressTitle, writepath, MissingFilesList);
|
||||||
|
|
||||||
if(choice == 3)
|
if(choice == 3 && FileSkipped > 0 && Settings.discart > 1)
|
||||||
{
|
|
||||||
downloadURL = (Settings.discart == 0 || Settings.discart == 2) ? serverURLOrigDiscs : serverURLCustomDiscs;
|
|
||||||
}
|
|
||||||
|
|
||||||
int FileSkipped = CoverDownloadWithProgress(downloadURL, writepath, MissingFilesList);
|
|
||||||
|
|
||||||
if(choice == 3 && FileSkipped > 0)
|
|
||||||
{
|
{
|
||||||
if(downloadURL == serverURLOrigDiscs)
|
if(downloadURL == serverURLOrigDiscs)
|
||||||
|
{
|
||||||
|
progressTitle = tr("Trying custom Discarts");
|
||||||
downloadURL = serverURLCustomDiscs;
|
downloadURL = serverURLCustomDiscs;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
progressTitle = tr("Trying original Discarts");
|
||||||
downloadURL = serverURLOrigDiscs;
|
downloadURL = serverURLOrigDiscs;
|
||||||
|
}
|
||||||
|
|
||||||
GetMissingGameFiles(writepath, ".png", MissingFilesList);
|
GetMissingGameFiles(writepath, ".png", MissingFilesList);
|
||||||
FileSkipped = CoverDownloadWithProgress(downloadURL, writepath, MissingFilesList);
|
FileSkipped = CoverDownloadWithProgress(downloadURL, progressTitle, writepath, MissingFilesList);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FileSkipped == 0)
|
if (FileSkipped == 0)
|
||||||
|
@ -234,6 +234,15 @@ int DownloadFileToPath(const char *orig_url, const char *dest, bool UseFilename)
|
|||||||
strcat((char *) dest, filename);
|
strcat((char *) dest, filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!UseFilename && strcmp(filename, "") == 0)
|
||||||
|
{
|
||||||
|
const char * ptr = strrchr(dest, '/');
|
||||||
|
if(ptr) ptr++;
|
||||||
|
else ptr = dest;
|
||||||
|
|
||||||
|
snprintf(filename, sizeof(filename), "%s", ptr);
|
||||||
|
}
|
||||||
|
|
||||||
FILE *file = fopen(dest, "wb");
|
FILE *file = fopen(dest, "wb");
|
||||||
if(!file)
|
if(!file)
|
||||||
{
|
{
|
||||||
|
@ -370,38 +370,28 @@ int NetworkWait()
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
int CheckUpdate()
|
int CheckUpdate()
|
||||||
{
|
{
|
||||||
if (!networkinitialized) return -1;
|
if (!networkinitialized)
|
||||||
|
return -1;
|
||||||
|
|
||||||
int revnumber = 0;
|
int revnumber = 0;
|
||||||
int currentrev = atoi(GetRev());
|
int currentrev = atoi(GetRev());
|
||||||
|
|
||||||
if (Settings.beta_upgrades)
|
|
||||||
{
|
|
||||||
revnumber = CheckForBetaUpdate();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#ifdef FULLCHANNEL
|
#ifdef FULLCHANNEL
|
||||||
struct block file = downloadfile( "http://www.techjawa.com/usbloadergx/wadrev.txt" );
|
struct block file = downloadfile( "http://www.techjawa.com/usbloadergx/wadrev.txt" );
|
||||||
#else
|
#else
|
||||||
struct block file = downloadfile("http://www.techjawa.com/usbloadergx/rev.txt");
|
struct block file = downloadfile("http://www.techjawa.com/usbloadergx/rev.txt");
|
||||||
#endif
|
#endif
|
||||||
char revtxt[10];
|
|
||||||
|
|
||||||
u8 i;
|
if (file.data != NULL)
|
||||||
if (file.data != NULL)
|
{
|
||||||
{
|
revnumber = atoi((char *) file.data);
|
||||||
for (i = 0; i < 9 || i < file.size; i++)
|
free(file.data);
|
||||||
revtxt[i] = file.data[i];
|
|
||||||
revtxt[i] = 0;
|
|
||||||
revnumber = atoi(revtxt);
|
|
||||||
free(file.data);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (revnumber > currentrev)
|
if (revnumber > currentrev)
|
||||||
return revnumber;
|
return revnumber;
|
||||||
else return -1;
|
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -39,6 +39,13 @@
|
|||||||
#include "FileDownloader.h"
|
#include "FileDownloader.h"
|
||||||
#include "settings/CSettings.h"
|
#include "settings/CSettings.h"
|
||||||
#include "settings/GameTitles.h"
|
#include "settings/GameTitles.h"
|
||||||
|
#include "language/gettext.h"
|
||||||
|
#include "language/UpdateLanguage.h"
|
||||||
|
#include "homebrewboot/BootHomebrew.h"
|
||||||
|
#include "utils/StringTools.h"
|
||||||
|
#include "utils/ShowError.h"
|
||||||
|
#include "prompts/PromptWindows.h"
|
||||||
|
#include "FileOperations/fileops.h"
|
||||||
#include "xml/WiiTDB.hpp"
|
#include "xml/WiiTDB.hpp"
|
||||||
|
|
||||||
static const char * WiiTDB_URL = "http://wiitdb.com/wiitdb.zip";
|
static const char * WiiTDB_URL = "http://wiitdb.com/wiitdb.zip";
|
||||||
@ -154,3 +161,175 @@ int UpdateWiiTDB()
|
|||||||
|
|
||||||
return (result ? filesize : -1);
|
return (result ? filesize : -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void UpdateIconPng()
|
||||||
|
{
|
||||||
|
char iconpath[200];
|
||||||
|
struct block file = downloadfile("http://www.techjawa.com/usbloadergx/icon.png");
|
||||||
|
if (file.data != NULL)
|
||||||
|
{
|
||||||
|
snprintf(iconpath, sizeof(iconpath), "%sicon.png", Settings.update_path);
|
||||||
|
FILE * pfile = fopen(iconpath, "wb");
|
||||||
|
if(pfile)
|
||||||
|
{
|
||||||
|
fwrite(file.data, 1, file.size, pfile);
|
||||||
|
fclose(pfile);
|
||||||
|
}
|
||||||
|
free(file.data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void UpdateMetaXml()
|
||||||
|
{
|
||||||
|
char xmlpath[200];
|
||||||
|
struct block file = downloadfile("http://www.techjawa.com/usbloadergx/meta.file");
|
||||||
|
if (file.data != NULL)
|
||||||
|
{
|
||||||
|
snprintf(xmlpath, sizeof(xmlpath), "%smeta.xml", Settings.update_path);
|
||||||
|
FILE *pfile = fopen(xmlpath, "wb");
|
||||||
|
if(pfile)
|
||||||
|
{
|
||||||
|
fwrite(file.data, 1, file.size, pfile);
|
||||||
|
fclose(pfile);
|
||||||
|
}
|
||||||
|
free(file.data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ApplicationDownload(int newrev)
|
||||||
|
{
|
||||||
|
bool update_error = false;
|
||||||
|
char tmppath[250];
|
||||||
|
|
||||||
|
#ifdef FULLCHANNEL
|
||||||
|
const char * DownloadURL = "http://www.techjawa.com/usbloadergx/ULNR.wad";
|
||||||
|
snprintf(tmppath, sizeof(tmppath), "%s/ULNR.wad", Settings.BootDevice);
|
||||||
|
#else
|
||||||
|
char realpath[250];
|
||||||
|
snprintf(realpath, sizeof(realpath), "%sboot.dol", Settings.update_path);
|
||||||
|
const char * DownloadURL = "http://www.techjawa.com/usbloadergx/boot.dol";
|
||||||
|
snprintf(tmppath, sizeof(tmppath), "%sboot.tmp", Settings.update_path);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int update_choice = WindowPrompt(fmt("Rev%i %s.", newrev, tr( "available" )), tr( "How do you want to update?" ), tr( "Update DOL" ), tr( "Update All" ), tr( "Cancel" ));
|
||||||
|
if (update_choice == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
int ret = DownloadFileToPath(DownloadURL, tmppath, false);
|
||||||
|
if(ret < 1024*1024)
|
||||||
|
{
|
||||||
|
remove(tmppath);
|
||||||
|
WindowPrompt(tr("Failed updating"), tr("Error while downloding file"), tr( "OK" ));
|
||||||
|
if(update_choice == 1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
update_error = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef FULLCHANNEL
|
||||||
|
FILE * wadFile = fopen(realpath, "rb");
|
||||||
|
if(!wadFile)
|
||||||
|
{
|
||||||
|
update_error = true;
|
||||||
|
WindowPrompt(tr("Failed updating"), tr("Error opening downloaded file"), tr( "OK" ));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int error = Wad_Install( wadFile );
|
||||||
|
if(error)
|
||||||
|
{
|
||||||
|
update_error = true;
|
||||||
|
ShowError(tr( "The wad installation failed with error %i" ), error);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
WindowPrompt(tr( "Success" ), tr( "The wad file was installed" ), tr( "OK" ));
|
||||||
|
|
||||||
|
RemoveFile(realpath);
|
||||||
|
#else
|
||||||
|
gprintf("%s\n%s\n", realpath, tmppath);
|
||||||
|
RemoveFile(realpath);
|
||||||
|
if(!RenameFile(tmppath, realpath))
|
||||||
|
update_error = true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (update_choice == 2)
|
||||||
|
{
|
||||||
|
UpdateIconPng();
|
||||||
|
UpdateMetaXml();
|
||||||
|
UpdateWiiTDB();
|
||||||
|
DownloadAllLanguageFiles();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(update_error)
|
||||||
|
{
|
||||||
|
ShowError(tr( "Error while updating USB Loader GX." ));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (update_choice > 0)
|
||||||
|
{
|
||||||
|
WindowPrompt(tr( "Restarting..." ), tr( "Successfully Updated thanks to www.techjawa.com" ), 0, 0, 0, 0, 150);
|
||||||
|
#ifdef FULLCHANNEL
|
||||||
|
ExitApp();
|
||||||
|
WII_Initialize();
|
||||||
|
WII_LaunchTitle(TITLE_ID( 0x00010001, 0x554c4e52 ));
|
||||||
|
#else
|
||||||
|
BootHomebrew(realpath);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int UpdateApp()
|
||||||
|
{
|
||||||
|
if (!IsNetworkInit() && !NetworkInitPrompt())
|
||||||
|
{
|
||||||
|
WindowPrompt(tr("Error !"), tr("Could not initialize network!"), tr("OK"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!CreateSubfolder(Settings.update_path))
|
||||||
|
{
|
||||||
|
WindowPrompt(tr("Error !"), tr("Can't create directory"), tr("OK"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int choice = WindowPrompt(tr( "What do you want to update?" ), 0, "USB Loader GX", tr( "WiiTDB Files" ), tr( "Language File" ), tr( "Cancel" ));
|
||||||
|
if(choice == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if(choice == 1)
|
||||||
|
{
|
||||||
|
int newrev = CheckUpdate();
|
||||||
|
if (newrev < 0)
|
||||||
|
{
|
||||||
|
WindowPrompt(tr( "No new updates." ), 0, tr( "OK" ));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ApplicationDownload(newrev);
|
||||||
|
}
|
||||||
|
else if (choice == 2)
|
||||||
|
{
|
||||||
|
if(UpdateWiiTDB() < 0)
|
||||||
|
{
|
||||||
|
WindowPrompt(fmt("%s", tr( "WiiTDB is up to date." )), 0, tr("OK"));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WindowPrompt(tr( "Successfully Updated" ), 0, tr( "OK" ));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (choice == 3)
|
||||||
|
{
|
||||||
|
if(UpdateLanguageFiles() > 0)
|
||||||
|
WindowPrompt(tr( "Successfully Updated" ), 0, tr( "OK" ));
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
@ -31,5 +31,6 @@
|
|||||||
|
|
||||||
int CheckForBetaUpdate();
|
int CheckForBetaUpdate();
|
||||||
int UpdateWiiTDB();
|
int UpdateWiiTDB();
|
||||||
|
int UpdateApp();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1013,10 +1013,7 @@ int WindowExitPrompt()
|
|||||||
{
|
{
|
||||||
ret = WindowPrompt(tr( "Are you sure?" ), 0, tr( "Yes" ), tr( "No" ));
|
ret = WindowPrompt(tr( "Are you sure?" ), 0, tr( "Yes" ), tr( "No" ));
|
||||||
if (ret == 1)
|
if (ret == 1)
|
||||||
{
|
|
||||||
|
|
||||||
choice = 2;
|
choice = 2;
|
||||||
}
|
|
||||||
HaltGui();
|
HaltGui();
|
||||||
mainWindow->SetState(STATE_DISABLED);
|
mainWindow->SetState(STATE_DISABLED);
|
||||||
promptWindow.SetState(STATE_DEFAULT);
|
promptWindow.SetState(STATE_DEFAULT);
|
||||||
@ -1028,9 +1025,7 @@ int WindowExitPrompt()
|
|||||||
{
|
{
|
||||||
ret = WindowPrompt(tr( "Are you sure?" ), 0, tr( "Yes" ), tr( "No" ));
|
ret = WindowPrompt(tr( "Are you sure?" ), 0, tr( "Yes" ), tr( "No" ));
|
||||||
if (ret == 1)
|
if (ret == 1)
|
||||||
{
|
|
||||||
choice = 3;
|
choice = 3;
|
||||||
}
|
|
||||||
HaltGui();
|
HaltGui();
|
||||||
mainWindow->SetState(STATE_DISABLED);
|
mainWindow->SetState(STATE_DISABLED);
|
||||||
promptWindow.SetState(STATE_DEFAULT);
|
promptWindow.SetState(STATE_DEFAULT);
|
||||||
@ -2047,708 +2042,6 @@ bool NetworkInitPrompt()
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* ProgressWindow
|
|
||||||
*
|
|
||||||
* Opens a window, which displays progress to the user. Can either display a
|
|
||||||
* progress bar showing % completion, or a throbber that only shows that an
|
|
||||||
* action is in progress.
|
|
||||||
***************************************************************************/
|
|
||||||
#define BLOCKSIZE 1024
|
|
||||||
/*bool unzipArchive(char * zipfilepath, char * unzipfolderpath)
|
|
||||||
{
|
|
||||||
unzFile uf = unzOpen(zipfilepath);
|
|
||||||
if (uf==NULL)
|
|
||||||
{
|
|
||||||
// printf("Cannot open %s, aborting\n",zipfilepath);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
//printf("%s opened\n",zipfilepath);
|
|
||||||
if(chdir(unzipfolderpath)) // can't access dir
|
|
||||||
{
|
|
||||||
makedir(unzipfolderpath); // attempt to make dir
|
|
||||||
if(chdir(unzipfolderpath)) // still can't access dir
|
|
||||||
{
|
|
||||||
//printf("Error changing into %s, aborting\n", unzipfolderpath);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
extractZip(uf,0,1,0);
|
|
||||||
unzCloseCurrentFile(uf);
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef FULLCHANNEL ///////////////////this is only used if the dol is being compiled for a full channel
|
|
||||||
int ProgressUpdateWindow()
|
|
||||||
{
|
|
||||||
int ret = 0, failed = 0;
|
|
||||||
|
|
||||||
gprintf( "\nProgressUpdateWindow(full channel)" );
|
|
||||||
GuiWindow promptWindow( 472, 320 );
|
|
||||||
promptWindow.SetAlignment( ALIGN_CENTRE, ALIGN_MIDDLE );
|
|
||||||
promptWindow.SetPosition( 0, -10 );
|
|
||||||
|
|
||||||
char imgPath[100];
|
|
||||||
snprintf( imgPath, sizeof( imgPath ), "%sbutton_dialogue_box.png", Settings.theme_path );
|
|
||||||
GuiImageData btnOutline( imgPath, button_dialogue_box_png );
|
|
||||||
snprintf( imgPath, sizeof( imgPath ), "%sdialogue_box.png", Settings.theme_path );
|
|
||||||
GuiImageData dialogBox( imgPath, dialogue_box_png );
|
|
||||||
GuiTrigger trigA;
|
|
||||||
trigA.SetSimpleTrigger( -1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A );
|
|
||||||
|
|
||||||
GuiImage dialogBoxImg( &dialogBox );
|
|
||||||
if ( Settings.wsprompt )
|
|
||||||
{
|
|
||||||
dialogBoxImg.SetWidescreen( Settings.widescreen );
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf( imgPath, sizeof( imgPath ), "%sprogressbar_outline.png", Settings.theme_path );
|
|
||||||
GuiImageData progressbarOutline( imgPath, progressbar_outline_png );
|
|
||||||
GuiImage progressbarOutlineImg( &progressbarOutline );
|
|
||||||
if ( Settings.wsprompt )
|
|
||||||
{
|
|
||||||
progressbarOutlineImg.SetWidescreen( Settings.widescreen );
|
|
||||||
}
|
|
||||||
progressbarOutlineImg.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE );
|
|
||||||
progressbarOutlineImg.SetPosition( 25, 7 );
|
|
||||||
|
|
||||||
snprintf( imgPath, sizeof( imgPath ), "%sprogressbar_empty.png", Settings.theme_path );
|
|
||||||
GuiImageData progressbarEmpty( imgPath, progressbar_empty_png );
|
|
||||||
GuiImage progressbarEmptyImg( &progressbarEmpty );
|
|
||||||
progressbarEmptyImg.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE );
|
|
||||||
progressbarEmptyImg.SetPosition( 25, 7 );
|
|
||||||
progressbarEmptyImg.SetTile( 100 );
|
|
||||||
|
|
||||||
snprintf( imgPath, sizeof( imgPath ), "%sprogressbar.png", Settings.theme_path );
|
|
||||||
GuiImageData progressbar( imgPath, progressbar_png );
|
|
||||||
GuiImage progressbarImg( &progressbar );
|
|
||||||
progressbarImg.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE );
|
|
||||||
progressbarImg.SetPosition( 25, 7 );
|
|
||||||
|
|
||||||
char title[50];
|
|
||||||
sprintf( title, "%s", tr( "Checking for Updates" ) );
|
|
||||||
GuiText titleTxt( title, 26, Theme.prompttext );
|
|
||||||
titleTxt.SetAlignment( ALIGN_CENTRE, ALIGN_TOP );
|
|
||||||
titleTxt.SetPosition( 0, 50 );
|
|
||||||
char msg[50];
|
|
||||||
sprintf( msg, "%s", tr( "Initializing Network" ) );
|
|
||||||
GuiText msgTxt( msg, 26, Theme.prompttext );
|
|
||||||
msgTxt.SetAlignment( ALIGN_CENTRE, ALIGN_TOP );
|
|
||||||
msgTxt.SetPosition( 0, 140 );
|
|
||||||
char msg2[50] = " ";
|
|
||||||
GuiText msg2Txt( msg2, 26, Theme.prompttext );
|
|
||||||
msg2Txt.SetAlignment( ALIGN_CENTRE, ALIGN_MIDDLE );
|
|
||||||
msg2Txt.SetPosition( 0, 50 );
|
|
||||||
|
|
||||||
GuiText prTxt( NULL, 26, Theme.prompttext );
|
|
||||||
prTxt.SetAlignment( ALIGN_CENTRE, ALIGN_MIDDLE );
|
|
||||||
prTxt.SetPosition( 0, 7 );
|
|
||||||
|
|
||||||
GuiText btn1Txt( tr( "Cancel" ), 22, Theme.prompttext );
|
|
||||||
GuiImage btn1Img( &btnOutline );
|
|
||||||
if ( Settings.wsprompt )
|
|
||||||
{
|
|
||||||
btn1Txt.SetWidescreen( Settings.widescreen );
|
|
||||||
btn1Img.SetWidescreen( Settings.widescreen );
|
|
||||||
}
|
|
||||||
GuiButton btn1( &btn1Img, &btn1Img, 2, 4, 0, -40, &trigA, btnSoundOver, btnSoundClick2, 1 );
|
|
||||||
btn1.SetLabel( &btn1Txt );
|
|
||||||
btn1.SetState( STATE_SELECTED );
|
|
||||||
|
|
||||||
if ( ( Settings.wsprompt ) && ( Settings.widescreen ) ) /////////////adjust for widescreen
|
|
||||||
|
|
||||||
{
|
|
||||||
progressbarOutlineImg.SetAlignment( ALIGN_CENTRE, ALIGN_MIDDLE );
|
|
||||||
progressbarOutlineImg.SetPosition( 0, 7 );
|
|
||||||
progressbarEmptyImg.SetPosition( 80, 7 );
|
|
||||||
progressbarEmptyImg.SetTile( 78 );
|
|
||||||
progressbarImg.SetPosition( 80, 7 );
|
|
||||||
}
|
|
||||||
|
|
||||||
promptWindow.Append( &dialogBoxImg );
|
|
||||||
promptWindow.Append( &titleTxt );
|
|
||||||
promptWindow.Append( &msgTxt );
|
|
||||||
promptWindow.Append( &msg2Txt );
|
|
||||||
promptWindow.Append( &btn1 );
|
|
||||||
|
|
||||||
promptWindow.SetEffect( EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50 );
|
|
||||||
|
|
||||||
HaltGui();
|
|
||||||
mainWindow->SetState( STATE_DISABLED );
|
|
||||||
mainWindow->Append( &promptWindow );
|
|
||||||
mainWindow->ChangeFocus( &promptWindow );
|
|
||||||
ResumeGui();
|
|
||||||
|
|
||||||
struct stat st;
|
|
||||||
if ( stat( Settings.update_path, &st ) != 0 )
|
|
||||||
{
|
|
||||||
if ( subfoldercreate( Settings.covers_path ) != 1 )
|
|
||||||
{
|
|
||||||
WindowPrompt( tr( "Error !" ), tr( "Can't create directory" ), tr( "OK" ) );
|
|
||||||
ret = -1;
|
|
||||||
failed = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( stat( Settings.titlestxt_path, &st ) != 0 )
|
|
||||||
{
|
|
||||||
if ( subfoldercreate( Settings.titlestxt_path ) != 1 )
|
|
||||||
{
|
|
||||||
WindowPrompt( tr( "Error !" ), tr( "Can't create directory" ), tr( "OK" ) );
|
|
||||||
ret = -1;
|
|
||||||
failed = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
char dolpath[150];
|
|
||||||
// char dolpathsuccess[150];//use coverspath as a folder for the update wad so we dont make a new folder and have to delete it
|
|
||||||
snprintf( dolpath, sizeof( dolpath ), "%sULNR.wad", Settings.covers_path );
|
|
||||||
//snprintf(dolpathsuccess, sizeof(dolpathsuccess), "%sUNEO.wad", Settings.covers_path);
|
|
||||||
Initialize_Network();
|
|
||||||
while ( !IsNetworkInit() )
|
|
||||||
{
|
|
||||||
|
|
||||||
VIDEO_WaitVSync();
|
|
||||||
|
|
||||||
Initialize_Network();
|
|
||||||
|
|
||||||
if ( IsNetworkInit() )
|
|
||||||
{
|
|
||||||
msgTxt.SetText( GetNetworkIP() );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
msgTxt.SetText( tr( "Could not initialize network!" ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( btn1.GetState() == STATE_CLICKED )
|
|
||||||
{
|
|
||||||
ret = -1;
|
|
||||||
failed = -1;
|
|
||||||
btn1.ResetState();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( IsNetworkInit() && ret >= 0 )
|
|
||||||
{
|
|
||||||
|
|
||||||
int newrev = CheckUpdate();
|
|
||||||
|
|
||||||
if ( newrev > 0 )
|
|
||||||
{
|
|
||||||
FILE * pfile;
|
|
||||||
sprintf( msg, "Rev%i %s.", newrev, tr( "available" ) );
|
|
||||||
int choice = WindowPrompt( msg, 0, tr( "Update" ), tr( "Cancel" ) );
|
|
||||||
if ( choice == 1 )
|
|
||||||
{
|
|
||||||
titleTxt.SetTextf( "%s USB Loader GX", tr( "Updating" ) );
|
|
||||||
msgTxt.SetPosition( 0, 100 );
|
|
||||||
msgTxt.SetTextf( "%s", tr( "Updating WiiTDB.zip" ) );
|
|
||||||
UpdateWiiTDB();
|
|
||||||
msgTxt.SetTextf( "%s", tr( "Updating Language Files:" ) );
|
|
||||||
updateLanguageFiles();
|
|
||||||
promptWindow.Append( &progressbarEmptyImg );
|
|
||||||
promptWindow.Append( &progressbarImg );
|
|
||||||
promptWindow.Append( &progressbarOutlineImg );
|
|
||||||
promptWindow.Append( &prTxt );
|
|
||||||
msgTxt.SetTextf( "%s Rev%i wad.", tr( "Downloading" ), newrev );
|
|
||||||
s32 filesize;
|
|
||||||
if ( Settings.beta_upgrades )
|
|
||||||
{
|
|
||||||
char url[255];
|
|
||||||
memset( &url, 0, 255 );
|
|
||||||
sprintf( ( char * ) &url, "http://usbloader-gui.googlecode.com/files/r%d.wad", newrev );
|
|
||||||
filesize = download_request( ( char * ) & url );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
filesize = download_request( "http://www.techjawa.com/usbloadergx/ULNR.file" );//for some reason it didn't download completely when saved as a wad.
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( filesize > 0 )
|
|
||||||
{
|
|
||||||
|
|
||||||
pfile = fopen( dolpath, "wb" );//here we save the txt as a wad
|
|
||||||
u8 * blockbuffer = new unsigned char[BLOCKSIZE];
|
|
||||||
for ( s32 i = 0; i < filesize; i += BLOCKSIZE )
|
|
||||||
{
|
|
||||||
usleep( 100 );
|
|
||||||
prTxt.SetTextf( "%i%%", ( 100*i / filesize ) + 1 );
|
|
||||||
if ( ( Settings.wsprompt ) && ( Settings.widescreen ) )
|
|
||||||
{
|
|
||||||
progressbarImg.SetTile( 80*i / filesize );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
progressbarImg.SetTile( 100*i / filesize );
|
|
||||||
}
|
|
||||||
msg2Txt.SetTextf( "%iKB/%iKB", i / 1024, filesize / 1024 );
|
|
||||||
|
|
||||||
if ( btn1.GetState() == STATE_CLICKED )
|
|
||||||
{
|
|
||||||
fclose( pfile );
|
|
||||||
remove( dolpath );
|
|
||||||
failed = -1;
|
|
||||||
btn1.ResetState();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 blksize;
|
|
||||||
blksize = ( u32 )( filesize - i );
|
|
||||||
if ( blksize > BLOCKSIZE )
|
|
||||||
blksize = BLOCKSIZE;
|
|
||||||
|
|
||||||
ret = network_read( blockbuffer, blksize );
|
|
||||||
if ( ret != ( s32 ) blksize )
|
|
||||||
{
|
|
||||||
failed = -1;
|
|
||||||
ret = -1;
|
|
||||||
fclose( pfile );
|
|
||||||
remove( dolpath );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
fwrite( blockbuffer, 1, blksize, pfile );
|
|
||||||
}
|
|
||||||
fclose( pfile );
|
|
||||||
delete blockbuffer;
|
|
||||||
if ( !failed )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
failed = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ret = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
WindowPrompt( tr( "No new updates." ), 0, tr( "OK" ) );
|
|
||||||
ret = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
promptWindow.SetEffect( EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50 );
|
|
||||||
while ( promptWindow.GetEffect() > 0 ) usleep( 50 );
|
|
||||||
|
|
||||||
HaltGui();
|
|
||||||
mainWindow->Remove( &promptWindow );
|
|
||||||
//mainWindow->SetState(STATE_DEFAULT);
|
|
||||||
ResumeGui();
|
|
||||||
CloseConnection();
|
|
||||||
sleep( 1 );//sleep 1 because it froze without this for some reason
|
|
||||||
|
|
||||||
if ( !failed && ret >= 0 )
|
|
||||||
{
|
|
||||||
|
|
||||||
FILE *wadFile = NULL;
|
|
||||||
s32 error = 1;
|
|
||||||
int diarhea = 0;
|
|
||||||
char nipple[100];
|
|
||||||
wadFile = fopen ( dolpath , "rb" );
|
|
||||||
if ( wadFile == NULL ) //we can't open the file wad we just downloaded
|
|
||||||
|
|
||||||
{
|
|
||||||
sprintf( nipple, tr( "Unable to open the wad that was just downloaded (%s)." ), dolpath );
|
|
||||||
WindowPrompt( tr( "Error !" ), nipple, tr( "OK" ) );
|
|
||||||
failed = -1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//sprintf(nipple, tr("The update wad has been saved as %s. Now let's try to install it."),dolpath);
|
|
||||||
//WindowPrompt(0,nipple, tr("OK"));
|
|
||||||
gprintf( "\n\tinstall wad" );
|
|
||||||
error = Wad_Install( wadFile );
|
|
||||||
fclose( wadFile );
|
|
||||||
if ( error == 0 )
|
|
||||||
{
|
|
||||||
diarhea = remove( dolpath );
|
|
||||||
if ( diarhea )
|
|
||||||
WindowPrompt( tr( "Success" ), tr( "The wad file was installed. But It could not be deleted from the SD card." ), tr( "OK" ) );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gprintf( " -> failed" );
|
|
||||||
sprintf( nipple, tr( "The wad installation failed with error %ld" ), error );
|
|
||||||
WindowPrompt( tr( "Error" ), nipple, tr( "OK" ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( error )
|
|
||||||
WindowPrompt( tr( "ERROR" ) , tr( "An Error occured" ), tr( "OK" ) );
|
|
||||||
else
|
|
||||||
{
|
|
||||||
WindowPrompt( tr( "Restarting..." ), tr( "Successfully Updated thanks to www.techjawa.com" ) , 0, 0, 0, 0, 150 );
|
|
||||||
}
|
|
||||||
CloseXMLDatabase();
|
|
||||||
ExitGUIThreads();
|
|
||||||
ShutdownAudio();
|
|
||||||
StopGX();
|
|
||||||
gprintf( "\nRebooting" );
|
|
||||||
WII_Initialize();
|
|
||||||
WII_LaunchTitle( TITLE_ID( 0x00010001, 0x554c4e52 ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
// promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
||||||
//while(promptWindow.GetEffect() > 0) usleep(100);
|
|
||||||
|
|
||||||
HaltGui();
|
|
||||||
//mainWindow->Remove(&promptWindow);
|
|
||||||
mainWindow->SetState( STATE_DEFAULT );
|
|
||||||
ResumeGui();
|
|
||||||
|
|
||||||
if ( failed != 0 )
|
|
||||||
return failed;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
int ProgressUpdateWindow()
|
|
||||||
{
|
|
||||||
|
|
||||||
gprintf("\nProgressUpdateWindow(not full channel)");
|
|
||||||
int ret = 0, failed = 0, updatemode = -1;
|
|
||||||
|
|
||||||
GuiWindow promptWindow(472, 320);
|
|
||||||
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
||||||
promptWindow.SetPosition(0, -10);
|
|
||||||
|
|
||||||
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
|
|
||||||
GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png"));
|
|
||||||
GuiTrigger trigA;
|
|
||||||
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
|
||||||
|
|
||||||
GuiImage dialogBoxImg(&dialogBox);
|
|
||||||
if (Settings.wsprompt)
|
|
||||||
{
|
|
||||||
dialogBoxImg.SetWidescreen(Settings.widescreen);
|
|
||||||
}
|
|
||||||
|
|
||||||
GuiImageData progressbarOutline(Resources::GetFile("progressbar_outline.png"), Resources::GetFileSize("progressbar_outline.png"));
|
|
||||||
GuiImage progressbarOutlineImg(&progressbarOutline);
|
|
||||||
if (Settings.wsprompt)
|
|
||||||
{
|
|
||||||
progressbarOutlineImg.SetWidescreen(Settings.widescreen);
|
|
||||||
}
|
|
||||||
progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
|
|
||||||
progressbarOutlineImg.SetPosition(25, 7);
|
|
||||||
|
|
||||||
GuiImageData progressbarEmpty(Resources::GetFile("progressbar_empty.png"), Resources::GetFileSize("progressbar_empty.png"));
|
|
||||||
GuiImage progressbarEmptyImg(&progressbarEmpty);
|
|
||||||
progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
|
|
||||||
progressbarEmptyImg.SetPosition(25, 7);
|
|
||||||
progressbarEmptyImg.SetTile(100);
|
|
||||||
|
|
||||||
GuiImageData progressbar(Resources::GetFile("progressbar.png"), Resources::GetFileSize("progressbar.png"));
|
|
||||||
GuiImage progressbarImg(&progressbar);
|
|
||||||
progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
|
|
||||||
progressbarImg.SetPosition(25, 7);
|
|
||||||
|
|
||||||
char title[50];
|
|
||||||
sprintf(title, "%s", tr( "Checking for Updates" ));
|
|
||||||
GuiText titleTxt(title, 26, Theme.prompttext);
|
|
||||||
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
||||||
titleTxt.SetPosition(0, 50);
|
|
||||||
char msg[50];
|
|
||||||
sprintf(msg, "%s", tr( "Initializing Network" ));
|
|
||||||
GuiText msgTxt(msg, 26, Theme.prompttext);
|
|
||||||
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
||||||
msgTxt.SetPosition(0, 140);
|
|
||||||
char msg2[50] = " ";
|
|
||||||
GuiText msg2Txt(msg2, 26, Theme.prompttext);
|
|
||||||
msg2Txt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
||||||
msg2Txt.SetPosition(0, 50);
|
|
||||||
|
|
||||||
GuiText prTxt((char*) NULL, 26, Theme.prompttext);
|
|
||||||
prTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
||||||
prTxt.SetPosition(0, 7);
|
|
||||||
|
|
||||||
GuiText btn1Txt(tr( "Cancel" ), 22, Theme.prompttext);
|
|
||||||
GuiImage btn1Img(&btnOutline);
|
|
||||||
if (Settings.wsprompt)
|
|
||||||
{
|
|
||||||
btn1Txt.SetWidescreen(Settings.widescreen);
|
|
||||||
btn1Img.SetWidescreen(Settings.widescreen);
|
|
||||||
}
|
|
||||||
GuiButton btn1(&btn1Img, &btn1Img, 2, 4, 0, -40, &trigA, btnSoundOver, btnSoundClick2, 1);
|
|
||||||
btn1.SetLabel(&btn1Txt);
|
|
||||||
btn1.SetState(STATE_SELECTED);
|
|
||||||
|
|
||||||
if ((Settings.wsprompt) && (Settings.widescreen)) /////////////adjust for widescreen
|
|
||||||
{
|
|
||||||
progressbarOutlineImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
||||||
progressbarOutlineImg.SetPosition(0, 7);
|
|
||||||
progressbarEmptyImg.SetPosition(80, 7);
|
|
||||||
progressbarEmptyImg.SetTile(78);
|
|
||||||
progressbarImg.SetPosition(80, 7);
|
|
||||||
}
|
|
||||||
|
|
||||||
promptWindow.Append(&dialogBoxImg);
|
|
||||||
promptWindow.Append(&titleTxt);
|
|
||||||
promptWindow.Append(&msgTxt);
|
|
||||||
promptWindow.Append(&msg2Txt);
|
|
||||||
promptWindow.Append(&btn1);
|
|
||||||
|
|
||||||
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
|
|
||||||
|
|
||||||
HaltGui();
|
|
||||||
mainWindow->SetState(STATE_DISABLED);
|
|
||||||
mainWindow->Append(&promptWindow);
|
|
||||||
mainWindow->ChangeFocus(&promptWindow);
|
|
||||||
ResumeGui();
|
|
||||||
|
|
||||||
struct stat st;
|
|
||||||
if (stat(Settings.update_path, &st) != 0)
|
|
||||||
{
|
|
||||||
if (!CreateSubfolder(Settings.update_path))
|
|
||||||
{
|
|
||||||
WindowPrompt(tr( "Error !" ), tr( "Can't create directory" ), tr( "OK" ));
|
|
||||||
ret = -1;
|
|
||||||
failed = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
char dolpath[150];
|
|
||||||
char dolpathsuccess[150];
|
|
||||||
snprintf(dolpath, sizeof(dolpath), "%sbootnew.dol", Settings.update_path);
|
|
||||||
snprintf(dolpathsuccess, sizeof(dolpathsuccess), "%sboot.dol", Settings.update_path);
|
|
||||||
|
|
||||||
while (!IsNetworkInit())
|
|
||||||
{
|
|
||||||
|
|
||||||
VIDEO_WaitVSync();
|
|
||||||
|
|
||||||
Initialize_Network();
|
|
||||||
|
|
||||||
if (IsNetworkInit())
|
|
||||||
{
|
|
||||||
msgTxt.SetText(GetNetworkIP());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
msgTxt.SetText(tr( "Could not initialize network!" ));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (btn1.GetState() == STATE_CLICKED)
|
|
||||||
{
|
|
||||||
ret = -1;
|
|
||||||
failed = -1;
|
|
||||||
btn1.ResetState();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//make the URL to get XML based on our games
|
|
||||||
//std::string allocates the memory and does not depend on stack
|
|
||||||
std::string XMLurl;
|
|
||||||
XMLurl.resize(4096);
|
|
||||||
build_XML_URL(&XMLurl[0], XMLurl.size());
|
|
||||||
|
|
||||||
if (IsNetworkInit() && ret >= 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
updatemode = WindowPrompt(tr( "What do you want to update?" ), 0, "USB Loader GX", tr( "WiiTDB Files" ), tr( "Language File" ), tr( "Cancel" ));
|
|
||||||
mainWindow->SetState(STATE_DISABLED);
|
|
||||||
promptWindow.SetState(STATE_DEFAULT);
|
|
||||||
mainWindow->ChangeFocus(&promptWindow);
|
|
||||||
|
|
||||||
if (updatemode == 1)
|
|
||||||
{
|
|
||||||
|
|
||||||
int newrev = CheckUpdate();
|
|
||||||
if (newrev > 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
sprintf(msg, "Rev%i %s.", newrev, tr( "available" ));
|
|
||||||
int choice = WindowPrompt(msg, tr( "How do you want to update?" ), tr( "Update DOL" ),
|
|
||||||
tr( "Update All" ), tr( "Cancel" ));
|
|
||||||
mainWindow->SetState(STATE_DISABLED);
|
|
||||||
promptWindow.SetState(STATE_DEFAULT);
|
|
||||||
mainWindow->ChangeFocus(&promptWindow);
|
|
||||||
if (choice == 1 || choice == 2)
|
|
||||||
{
|
|
||||||
titleTxt.SetTextf("%s USB Loader GX", tr( "Updating" ));
|
|
||||||
msgTxt.SetPosition(0, 100);
|
|
||||||
promptWindow.Append(&progressbarEmptyImg);
|
|
||||||
promptWindow.Append(&progressbarImg);
|
|
||||||
promptWindow.Append(&progressbarOutlineImg);
|
|
||||||
promptWindow.Append(&prTxt);
|
|
||||||
msgTxt.SetTextf("%s Rev%i", tr( "Update to" ), newrev);
|
|
||||||
|
|
||||||
s32 filesize;
|
|
||||||
if (Settings.beta_upgrades)
|
|
||||||
{
|
|
||||||
char url[255];
|
|
||||||
memset(&url, 0, 255);
|
|
||||||
sprintf((char *) &url, "http://usbloader-gui.googlecode.com/files/r%d.dol", newrev);
|
|
||||||
filesize = download_request((char *) &url);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
filesize = download_request("http://www.techjawa.com/usbloadergx/boot.dol");
|
|
||||||
}
|
|
||||||
if (filesize > 0)
|
|
||||||
{
|
|
||||||
FILE * pfile;
|
|
||||||
pfile = fopen(dolpath, "wb");
|
|
||||||
u8 * blockbuffer = new unsigned char[BLOCKSIZE];
|
|
||||||
for (s32 i = 0; i < filesize; i += BLOCKSIZE)
|
|
||||||
{
|
|
||||||
usleep(100);
|
|
||||||
prTxt.SetTextf("%i%%", (100 * i / filesize) + 1);
|
|
||||||
if ((Settings.wsprompt) && (Settings.widescreen))
|
|
||||||
{
|
|
||||||
progressbarImg.SetTile(80 * i / filesize);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
progressbarImg.SetTile(100 * i / filesize);
|
|
||||||
}
|
|
||||||
msg2Txt.SetTextf("%iKB/%iKB", i / 1024, filesize / 1024);
|
|
||||||
|
|
||||||
if (btn1.GetState() == STATE_CLICKED)
|
|
||||||
{
|
|
||||||
fclose(pfile);
|
|
||||||
remove(dolpath);
|
|
||||||
failed = -1;
|
|
||||||
btn1.ResetState();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 blksize;
|
|
||||||
blksize = (u32) (filesize - i);
|
|
||||||
if (blksize > BLOCKSIZE) blksize = BLOCKSIZE;
|
|
||||||
|
|
||||||
ret = network_read(connection, blockbuffer, blksize);
|
|
||||||
if (ret != (s32) blksize)
|
|
||||||
{
|
|
||||||
failed = -1;
|
|
||||||
ret = -1;
|
|
||||||
fclose(pfile);
|
|
||||||
remove(dolpath);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
fwrite(blockbuffer, 1, blksize, pfile);
|
|
||||||
}
|
|
||||||
fclose(pfile);
|
|
||||||
delete blockbuffer;
|
|
||||||
if (!failed)
|
|
||||||
{
|
|
||||||
//remove old
|
|
||||||
if (CheckFile(dolpathsuccess))
|
|
||||||
{
|
|
||||||
remove(dolpathsuccess);
|
|
||||||
}
|
|
||||||
//rename new to old
|
|
||||||
rename(dolpath, dolpathsuccess);
|
|
||||||
|
|
||||||
if (choice == 2)
|
|
||||||
{
|
|
||||||
//get the icon.png and the meta.xml
|
|
||||||
char xmliconpath[150];
|
|
||||||
struct block file = downloadfile("http://www.techjawa.com/usbloadergx/meta.file");
|
|
||||||
if (file.data != NULL)
|
|
||||||
{
|
|
||||||
sprintf(xmliconpath, "%smeta.xml", Settings.update_path);
|
|
||||||
pfile = fopen(xmliconpath, "wb");
|
|
||||||
fwrite(file.data, 1, file.size, pfile);
|
|
||||||
fclose(pfile);
|
|
||||||
free(file.data);
|
|
||||||
}
|
|
||||||
file = downloadfile("http://www.techjawa.com/usbloadergx/icon.png");
|
|
||||||
if (file.data != NULL)
|
|
||||||
{
|
|
||||||
sprintf(xmliconpath, "%sicon.png", Settings.update_path);
|
|
||||||
pfile = fopen(xmliconpath, "wb");
|
|
||||||
fwrite(file.data, 1, file.size, pfile);
|
|
||||||
fclose(pfile);
|
|
||||||
free(file.data);
|
|
||||||
}
|
|
||||||
msgTxt.SetTextf("%s", tr( "Updating WiiTDB.zip" ));
|
|
||||||
UpdateWiiTDB();
|
|
||||||
msgTxt.SetTextf("%s", tr( "Updating Language Files:" ));
|
|
||||||
updateLanguageFiles();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
failed = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ret = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
WindowPrompt(tr( "No new updates." ), 0, tr( "OK" ));
|
|
||||||
ret = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (updatemode == 2)
|
|
||||||
{
|
|
||||||
msgTxt.SetTextf("%s", tr( "Updating WiiTDB.zip" ));
|
|
||||||
if(UpdateWiiTDB() < 0)
|
|
||||||
{
|
|
||||||
msgTxt.SetTextf("%s", tr( "WiiTDB is up to date." ));
|
|
||||||
sleep(3);
|
|
||||||
}
|
|
||||||
ret = 1;
|
|
||||||
}
|
|
||||||
else if (updatemode == 3)
|
|
||||||
{
|
|
||||||
|
|
||||||
msgTxt.SetTextf("%s", tr( "Updating Language Files..." ));
|
|
||||||
updateLanguageFiles();
|
|
||||||
ret = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ret = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CloseConnection();
|
|
||||||
|
|
||||||
if (!failed && ret >= 0 && updatemode == 1)
|
|
||||||
{
|
|
||||||
WindowPrompt(tr( "Restarting..." ), tr( "Successfully Updated thanks to www.techjawa.com" ), 0, 0, 0, 0, 150);
|
|
||||||
|
|
||||||
loadStub();
|
|
||||||
Set_Stub_Split(0x00010001, "UNEO");
|
|
||||||
Sys_BackToLoader();
|
|
||||||
}
|
|
||||||
else if (updatemode > 0 && ret > 0)
|
|
||||||
{
|
|
||||||
WindowPrompt(tr( "Successfully Updated" ), 0, tr( "OK" ));
|
|
||||||
}
|
|
||||||
|
|
||||||
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
||||||
while (promptWindow.GetEffect() > 0)
|
|
||||||
usleep(100);
|
|
||||||
|
|
||||||
HaltGui();
|
|
||||||
mainWindow->Remove(&promptWindow);
|
|
||||||
mainWindow->SetState(STATE_DEFAULT);
|
|
||||||
ResumeGui();
|
|
||||||
|
|
||||||
if (failed != 0) return failed;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int CodeDownload(const char *id)
|
int CodeDownload(const char *id)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -21,7 +21,6 @@ int WindowExitPrompt();
|
|||||||
int GameWindowPrompt(int & gameSelected);
|
int GameWindowPrompt(int & gameSelected);
|
||||||
int DiscWait(const char *title, const char *msg, const char *btn1Label, const char *btn2Label, int IsDeviceWait);
|
int DiscWait(const char *title, const char *msg, const char *btn1Label, const char *btn2Label, int IsDeviceWait);
|
||||||
int FormatingPartition(const char *title, partitionEntry *entry);
|
int FormatingPartition(const char *title, partitionEntry *entry);
|
||||||
int ProgressUpdateWindow();
|
|
||||||
bool NetworkInitPrompt();
|
bool NetworkInitPrompt();
|
||||||
int WindowScreensaver();
|
int WindowScreensaver();
|
||||||
int CodeDownload(const char *id);
|
int CodeDownload(const char *id);
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "language/gettext.h"
|
#include "language/gettext.h"
|
||||||
|
#include "language/UpdateLanguage.h"
|
||||||
#include "prompts/PromptWindows.h"
|
#include "prompts/PromptWindows.h"
|
||||||
#include "prompts/ProgressWindow.h"
|
#include "prompts/ProgressWindow.h"
|
||||||
#include "libwiigui/gui.h"
|
#include "libwiigui/gui.h"
|
||||||
@ -100,7 +101,7 @@ int MenuLanguageSelect()
|
|||||||
trigB.SetButtonOnlyTrigger( -1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B );
|
trigB.SetButtonOnlyTrigger( -1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B );
|
||||||
|
|
||||||
char fullpath[100];
|
char fullpath[100];
|
||||||
DirList Dir( Settings.languagefiles_path );
|
DirList Dir(Settings.languagefiles_path, ".lang");
|
||||||
|
|
||||||
if ( !strcmp( "", Settings.language_path ) )
|
if ( !strcmp( "", Settings.language_path ) )
|
||||||
{
|
{
|
||||||
@ -254,51 +255,10 @@ int MenuLanguageSelect()
|
|||||||
choice = WindowPrompt( tr( "Update all Language Files" ), tr( "Do you wish to update/download all language files?" ), tr( "OK" ), tr( "Cancel" ) );
|
choice = WindowPrompt( tr( "Update all Language Files" ), tr( "Do you wish to update/download all language files?" ), tr( "OK" ), tr( "Cancel" ) );
|
||||||
if ( choice == 1 )
|
if ( choice == 1 )
|
||||||
{
|
{
|
||||||
|
if (IsNetworkInit() || NetworkInitPrompt())
|
||||||
bool network = true;
|
|
||||||
if ( !IsNetworkInit() )
|
|
||||||
{
|
{
|
||||||
network = NetworkInitPrompt();
|
if(DownloadAllLanguageFiles() > 0)
|
||||||
}
|
WindowPrompt(tr("Update successfull"), 0, tr("OK"));
|
||||||
|
|
||||||
if ( network )
|
|
||||||
{
|
|
||||||
const char URL[60] = "http://usbloader-gui.googlecode.com/svn/trunk/Languages/";
|
|
||||||
char fullURL[300];
|
|
||||||
FILE *pfile;
|
|
||||||
|
|
||||||
URL_List LinkList( URL );
|
|
||||||
int listsize = LinkList.GetURLCount();
|
|
||||||
|
|
||||||
CreateSubfolder( Settings.languagefiles_path );
|
|
||||||
|
|
||||||
for ( int i = 0; i < listsize; i++ )
|
|
||||||
{
|
|
||||||
|
|
||||||
ShowProgress( tr( "Updating Language Files:" ), 0, LinkList.GetURL( i ), i, listsize - 1 );
|
|
||||||
|
|
||||||
if ( strcasecmp( ".lang", strrchr( LinkList.GetURL( i ), '.' ) ) == 0 )
|
|
||||||
{
|
|
||||||
|
|
||||||
snprintf( fullURL, sizeof( fullURL ), "%s%s", URL, LinkList.GetURL( i ) );
|
|
||||||
|
|
||||||
struct block file = downloadfile( fullURL );
|
|
||||||
|
|
||||||
if ( file.data && file.size )
|
|
||||||
{
|
|
||||||
char filepath[300];
|
|
||||||
|
|
||||||
snprintf( filepath, sizeof( filepath ), "%s%s", Settings.languagefiles_path, LinkList.GetURL( i ) );
|
|
||||||
pfile = fopen( filepath, "wb" );
|
|
||||||
fwrite( file.data, 1, file.size, pfile );
|
|
||||||
fclose( pfile );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
free( file.data );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ProgressStop();
|
|
||||||
returnhere = 1;
|
returnhere = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -354,7 +314,9 @@ int MenuLanguageSelect()
|
|||||||
{
|
{
|
||||||
char newLangPath[150];
|
char newLangPath[150];
|
||||||
snprintf( Settings.languagefiles_path, sizeof( Settings.languagefiles_path ), "%s", Dir.GetFilepath(ret));
|
snprintf( Settings.languagefiles_path, sizeof( Settings.languagefiles_path ), "%s", Dir.GetFilepath(ret));
|
||||||
snprintf( newLangPath, sizeof( newLangPath ), "%s/%s", Dir.GetFilepath(ret), Dir.GetFilename( ret ) );
|
char * ptr = strrchr(Settings.languagefiles_path, '/');
|
||||||
|
if(ptr) ptr[1] = 0;
|
||||||
|
snprintf( newLangPath, sizeof( newLangPath ), "%s", Dir.GetFilepath(ret));
|
||||||
if ( !CheckFile( newLangPath ) )
|
if ( !CheckFile( newLangPath ) )
|
||||||
{
|
{
|
||||||
WindowPrompt( tr( "File not found." ), tr( "Loading standard language." ), tr( "OK" ) );
|
WindowPrompt( tr( "File not found." ), tr( "Loading standard language." ), tr( "OK" ) );
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include "GlobalSettings.hpp"
|
#include "GlobalSettings.hpp"
|
||||||
#include "themes/CTheme.h"
|
#include "themes/CTheme.h"
|
||||||
#include "prompts/PromptWindows.h"
|
#include "prompts/PromptWindows.h"
|
||||||
|
#include "network/update.h"
|
||||||
#include "language/gettext.h"
|
#include "language/gettext.h"
|
||||||
#include "GUISettingsMenu.hpp"
|
#include "GUISettingsMenu.hpp"
|
||||||
#include "GameLoadSM.hpp"
|
#include "GameLoadSM.hpp"
|
||||||
@ -122,7 +123,7 @@ void GlobalSettings::CreateSettingsMenu(int menuNr)
|
|||||||
HideMenu();
|
HideMenu();
|
||||||
Remove(backBtn);
|
Remove(backBtn);
|
||||||
ResumeGui();
|
ResumeGui();
|
||||||
int ret = ProgressUpdateWindow();
|
int ret = UpdateApp();
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
WindowPrompt(tr( "Update failed" ), 0, tr( "OK" ));
|
WindowPrompt(tr( "Update failed" ), 0, tr( "OK" ));
|
||||||
Append(backBtn);
|
Append(backBtn);
|
||||||
|
@ -73,10 +73,7 @@ void AppCleanUp(void)
|
|||||||
delete mainWindow;
|
delete mainWindow;
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
delete pointer[i];
|
delete pointer[i];
|
||||||
delete GameRegionTxt;
|
|
||||||
delete GameIDTxt;
|
|
||||||
delete cover;
|
|
||||||
delete coverImg;
|
|
||||||
gettextCleanUp();
|
gettextCleanUp();
|
||||||
CloseXMLDatabase();
|
CloseXMLDatabase();
|
||||||
ClearFontData();
|
ClearFontData();
|
||||||
@ -160,12 +157,10 @@ void Sys_LoadMenu(void)
|
|||||||
|
|
||||||
void Sys_BackToLoader(void)
|
void Sys_BackToLoader(void)
|
||||||
{
|
{
|
||||||
|
ExitApp();
|
||||||
|
|
||||||
if (hbcStubAvailable())
|
if (hbcStubAvailable())
|
||||||
{
|
|
||||||
ExitApp();
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
|
||||||
// Channel Version
|
// Channel Version
|
||||||
Sys_LoadMenu();
|
Sys_LoadMenu();
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
const char * fmt(const char * format, ...)
|
const char * fmt(const char * format, ...)
|
||||||
{
|
{
|
||||||
static char strChar[512];
|
static char strChar[512];
|
||||||
memset(strChar, 0, sizeof(strChar));
|
strChar[0] = 0;
|
||||||
char * tmp = NULL;
|
char * tmp = NULL;
|
||||||
|
|
||||||
va_list va;
|
va_list va;
|
||||||
@ -59,10 +59,10 @@ const wchar_t * wfmt(const char * format, ...)
|
|||||||
strWChar[0] = 0;
|
strWChar[0] = 0;
|
||||||
|
|
||||||
if(!format)
|
if(!format)
|
||||||
return (const wchar_t *) &strWChar;
|
return (const wchar_t *) strWChar;
|
||||||
|
|
||||||
if(strcmp(format, "") == 0)
|
if(strcmp(format, "") == 0)
|
||||||
return (const wchar_t *) &strWChar;
|
return (const wchar_t *) strWChar;
|
||||||
|
|
||||||
char * tmp = NULL;
|
char * tmp = NULL;
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ const wchar_t * wfmt(const char * format, ...)
|
|||||||
if(bt > 0)
|
if(bt > 0)
|
||||||
{
|
{
|
||||||
strWChar[bt] = 0;
|
strWChar[bt] = 0;
|
||||||
return (const wchar_t *) &strWChar;
|
return (const wchar_t *) strWChar;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
va_end(va);
|
va_end(va);
|
||||||
@ -98,7 +98,7 @@ bool char2wchar_t(const char * strChar, wchar_t * dest)
|
|||||||
int bt;
|
int bt;
|
||||||
bt = mbstowcs(dest, strChar, strlen(strChar));
|
bt = mbstowcs(dest, strChar, strlen(strChar));
|
||||||
if (bt > 0) {
|
if (bt > 0) {
|
||||||
dest[bt] = (wchar_t) '\0';
|
dest[bt] = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,3 +126,21 @@ int strtokcmp(const char * string, const char * compare, const char * separator)
|
|||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline const char * FullpathToFilename(const char *path)
|
||||||
|
{
|
||||||
|
if(!path) return path;
|
||||||
|
|
||||||
|
const char * ptr = path;
|
||||||
|
const char * Filename = ptr;
|
||||||
|
|
||||||
|
while(*ptr != '\0')
|
||||||
|
{
|
||||||
|
if(*ptr == '/' && ptr[1] != '\0')
|
||||||
|
Filename = ptr+1;
|
||||||
|
|
||||||
|
++ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Filename;
|
||||||
|
}
|
||||||
|
@ -36,6 +36,7 @@ const char * fmt(const char * format, ...);
|
|||||||
const wchar_t * wfmt(const char * format, ...);
|
const wchar_t * wfmt(const char * format, ...);
|
||||||
bool char2wchar_t(const char * src, wchar_t * dest);
|
bool char2wchar_t(const char * src, wchar_t * dest);
|
||||||
int strtokcmp(const char * string, const char * compare, const char * separator);
|
int strtokcmp(const char * string, const char * compare, const char * separator);
|
||||||
|
const char * FullpathToFilename(const char *path);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user