/**************************************************************************** * URL List Class * for USB Loader GX * by dimok ***************************************************************************/ #include #include #include #include #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 ); }