usbloadergx/source/network/URL_List.cpp

139 lines
3.3 KiB
C++
Raw Normal View History

/****************************************************************************
* 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);
}