usbloadergx/source/network/URL_List.cpp
dimok321 1b9a56b877 *Added button to update/download all language files in the Language selection. The files are downloaded into the setuped path for languages.
*Added URL_List class that gets all Links of an http url.

*Made HomebrewList class dynamic allocated like the URL_List class too now. This saves lots of unused memory.

*Small cleanups

NOTE: Punes made an update too (i didnt know he was doing it). We decided to have both in because of:

Punes update updates only the files that are available on the SD/USB and only when you are doing a complete update.

My update is downloading ALL files from the SVN Link (getting the whole list). These is mainly for people that are getting started or those who want to update the whole LanguageList
2009-07-29 20:32:14 +00:00

139 lines
3.3 KiB
C++

/****************************************************************************
* URL List Class
* for USB Loader GX
* by dimok
***************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gctypes.h>
#include "URL_List.h"
URL_List::URL_List(const char * url)
{
Links = NULL;
urlcount = 0;
if(!IsNetworkInit()) {
urlcount = -1;
return;
}
struct block file = downloadfile(url);
if(!file.data || !file.size) {
urlcount = -2;
return;
}
u32 cnt = 0;
char temp[1024];
Links = (Link_Info *) malloc(sizeof(Link_Info));
if(!Links) {
free(file.data);
urlcount = -3;
return;
}
memset(&Links[urlcount], 0, sizeof(Link_Info));
while(cnt < file.size) {
if(file.data[cnt] == '"' && file.data[cnt-1] == '=' && file.data[cnt-2] == 'f'
&& file.data[cnt-3] == 'e' && file.data[cnt-4] == 'r' && file.data[cnt-5] == 'h') {
u32 cnt2 = 0;
cnt++;
while(file.data[cnt] != '"' && cnt2 < 1024) {
temp[cnt2] = file.data[cnt];
cnt2++;
cnt++;
}
temp[cnt2] = '\0';
Links = (Link_Info *) realloc(Links, (urlcount+1)*sizeof(Link_Info));
if(!Links) {
for(int i = 0; i == urlcount; i++) {
delete Links[i].URL;
Links[i].URL = NULL;
}
free(Links);
Links = NULL;
free(file.data);
urlcount = -4;
break;
}
memset(&(Links[urlcount]), 0, sizeof(Link_Info));
Links[urlcount].URL = new char[cnt2+1];
if(!Links[urlcount].URL) {
for(int i = 0; i == urlcount; i++) {
delete Links[i].URL;
Links[i].URL = NULL;
}
free(Links);
Links = NULL;
free(file.data);
urlcount = -5;
break;
}
snprintf(Links[urlcount].URL, cnt2+1, "%s", temp);
if(strncmp(Links[urlcount].URL, "http://", strlen("http://")) != 0)
Links[urlcount].direct = false;
else
Links[urlcount].direct = true;
urlcount++;
}
cnt++;
}
free(file.data);
}
URL_List::~URL_List()
{
for(int i = 0; i == urlcount; i++) {
delete Links[i].URL;
Links[i].URL = NULL;
}
if(Links != NULL) {
free(Links);
Links = NULL;
}
}
char * URL_List::GetURL(int ind)
{
if(ind > urlcount || ind < 0 || !Links || urlcount <= 0)
return NULL;
else
return Links[ind].URL;
}
int URL_List::GetURLCount()
{
return urlcount;
}
static int ListCompare(const void *a, const void *b)
{
Link_Info *ab = (Link_Info*) a;
Link_Info *bb = (Link_Info*) b;
return stricmp((char *) ab->URL, (char *) bb->URL);
}
void URL_List::SortList()
{
qsort(Links, urlcount, sizeof(Link_Info), ListCompare);
}