diff options
| -rw-r--r-- | TODO | 30 | ||||
| -rw-r--r-- | download.c | 11 | ||||
| -rw-r--r-- | getht.c | 93 | ||||
| -rw-r--r-- | mediarev.c | 4 | ||||
| -rw-r--r-- | mediaxml.c | 3 | 
5 files changed, 104 insertions, 37 deletions
@@ -1,46 +1,40 @@  -savannah- -add news, with current status, likely time to usability, & hello -  add todo to tasks tracker  post a screenshot?  -immediate term- -if download fails, remove attempted file -if -uf is passed, download & parse media regardless (check that same isn't added multiple times) +add to docs email hook & script - see http://www.gnuarch.org/gnuarchwiki/Using_hooks + +check if file exists but is empty  handle ctrl-c by removing half-downloaded file  save entered directories to config file -utilise and expand initial clean procedures +?utilise and expand initial clean procedures  add sorting algo for issues, only needs a few pointers passing around, use temp iss*  	look online for v. basic sorting algos or write own  	then no more latest_iss pointer needed -add if file is readable checks to appropriate functions e.g. reading xml / rev and handle appropriately - -add new source file for freeing memory plus mem error functions - -handle file errors better -  -malloc- -include cover as just another section entry -  malloc sections, items, and media  	will ensure ease of finding existance, as no_of_sections no_of_media no_of_items can be used (embedded in struct) -handle smil files successfully +include cover as just another section entry -if no required contents file exists, attempt to retrieve it, even if update is not passed -comment source - at least all functions +add new source file for freeing memory plus mem error functions -#use autotools -integrate gettext +-other- + +#autotools +gettext + +handle smil files successfully  add options to allow decent listing of issues  add options to allow downloading of any issue @@ -44,7 +44,7 @@ extern char proxy_user[STR_MAX];  extern char proxy_pass[STR_MAX];  extern CURL *main_curl_handle; -void save_file(CURL *curl_handle, char *url, char *filepath) +int save_file(CURL *curl_handle, char *url, char *filepath)  /*	Save the file *url to *filepath */  {  	printf("Downloading %s\n",url); @@ -55,7 +55,10 @@ void save_file(CURL *curl_handle, char *url, char *filepath)  	if(curl_handle) {  		FILE *file;  		if((file = fopen(filepath,"w")) == NULL) +		{  			fprintf(stderr,"Error: cannot open file %s for writing.\n",filepath); +			return 1; +		}  		curl_easy_setopt(curl_handle, CURLOPT_URL, url);  		curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_func); @@ -98,7 +101,11 @@ void save_file(CURL *curl_handle, char *url, char *filepath)  		curl_easy_setopt(curl_handle, CURLOPT_PROGRESSFUNCTION, update_progress);  		if(curl_easy_perform(curl_handle)) +		{ +			remove(filepath);  			fprintf(stderr,"Error, could not download %s\n",url); +			return 1; +		}  /*		double d;  		curl_easy_getinfo(curl_handle, CURLINFO_SIZE_DOWNLOAD, &d); @@ -117,7 +124,9 @@ void save_file(CURL *curl_handle, char *url, char *filepath)  	else {  		fprintf(stderr,"Error: curl failed to initialise.\n");  		printf("Could not download %s\n",url); +		return 1;  	} +	return 0;  }  int update_progress(void *data, double dltotal, double dlnow, @@ -31,6 +31,10 @@  #include "issue.h"  #include "getht.h" +int update_contents_files(); + +med * findnewestmed(iss ** issue, int no_of_issues); +  void show_iss_struct(iss ** issue, int no_of_issues);  void show_med_struct(med * issue); @@ -39,8 +43,6 @@ void cleariss(iss * cur_issue);  void showusage(); -med * findnewestmed(iss ** issue, int no_of_issues); -  proxytype proxy_type; char proxy_addr[STR_MAX]; long proxy_port;  proxyauth proxy_auth;   char proxy_user[STR_MAX]; char proxy_pass[STR_MAX]; @@ -73,6 +75,7 @@ int main(int argc, char *argv[])  	int downallmedia = 0, downlatestmedia = 0;  	int downissue = 0, downmedia = 0;  	int force = 0, update = 0, showstr = 0; +	int option = 0;  	proxy_type = NONE;  	proxy_port = 0; @@ -105,39 +108,52 @@ int main(int argc, char *argv[])  		{"force", no_argument, 0, 'f'},  		{"update", no_argument, 0, 'u'},  		{"tocfile", required_argument, 0, 't'}, +		{"mediatocfile", required_argument, 0, 'x'},  		{"help", no_argument, 0, 'h'},  		{"version", no_argument, 0, 'v'},  		{0, 0, 0, 0}  	}; -	while((c = getopt_long(argc, argv, "adfhmnsuvxt:", long_opts, NULL)) != -1) { +	while((c = getopt_long(argc, argv, "adfhmnsuvx:t:", long_opts, NULL)) != -1) {  		switch(c) {  			case 'a':  				downall = 1;  				downissue = 1; +				option = 1;  				break;  			case 'd':  				downlatest = 1;  				downissue = 1; +				option = 1;  				break;  			case 'm':  				downallmedia = 1;  				downmedia = 1; +				option = 1;  				break;  			case 'n':  				downlatestmedia = 1;  				downmedia = 1; +				option = 1;  				break;  			case 'f':  				force = 1; +				option = 1;  				break;  			case 'u':  				update = 1; +				option = 1;  				break;  			case 's':  				showstr = 1; +				option = 1;  				break;  			case 't':  				strcpy(issue_xml, strdup(optarg)); +				option = 1; +				break; +			case 'x': +				strcpy(media_xml, strdup(optarg)); +				option = 1;  				break;  			case 'h':  				showusage(); @@ -145,6 +161,7 @@ int main(int argc, char *argv[])  				break;  			case 'v':  				printf("GetHT version: %s\n",VERSION); +				option = 1;  				return 0;  				break;  			default: @@ -152,12 +169,18 @@ int main(int argc, char *argv[])  		}  	} +	if(!option) +	{ +		showusage(); +		return 0; +	} +  	main_curl_handle = curl_easy_init();  	if(update)  	{ -		if(update_contents_files(NULL, NULL)) -			fprintf(stderr,"Could not update contents files"); +		if(update_contents_files()) +			fprintf(stderr,"Could not update contents files\n");  	}  	/* Parse TOC, filling issue structure */ @@ -171,6 +194,22 @@ int main(int argc, char *argv[])  	{  		issue = parsetoc(issue_xml, &no_of_issues, &latest_index); +		if(!issue) +		{ +			if(!update) +			{ +				printf("Cannot open contents file, trying to update contents\n"); +				if(update_contents_files()) +					return 1; +				issue = parsetoc(issue_xml, &no_of_issues, &latest_index); +			} +			else +			{ +				printf("Cannot open contents file, try running `getht --update`\n"); +				return 1; +			} +		} +  		if(showstr)  			show_iss_struct(issue, no_of_issues); @@ -198,6 +237,22 @@ int main(int argc, char *argv[])  		issue = parsemedia(media_xml, issue, &no_of_issues); +		if(!issue) +		{ +			if(!update) +			{ +				printf("Cannot open media contents file, trying to update contents\n"); +				if(update_contents_files()) +					return 1; +				issue = parsemedia(media_xml, issue, &no_of_issues); +			} +			else +			{ +				printf("Cannot open contents file, try running `getht --update`\n"); +				return 1; +			} +		} +  		if(downlatestmedia)  		{  			newest = findnewestiss(issue, no_of_issues); @@ -228,25 +283,29 @@ int main(int argc, char *argv[])  	return 0;  } -int update_contents_files(CURL *curl_handle, int temp) +int update_contents_files()  /* Returns 0 on success, 1 on failure */  { -	save_file(NULL, XML_TOC_URL, issue_xml); +	if(save_file(NULL, XML_TOC_URL, issue_xml)) +		return 1; -	/*	see if current issue's media toc has already -		been written to the xml, if not do so */ -  	char isstitle[STR_MAX];  	issdates date; +	/*	see if current issue's media toc has already +		been written to the xml, if not do so */  	if(access(issue_xml, R_OK) == 0) -		cur_identifiers(issue_xml, isstitle, &date); +	{ +		if(cur_identifiers(issue_xml, isstitle, &date)) +			return 1; +	}  	else  		return 1;  	if(media_accounted_for(media_xml, &date))  	{ -		save_file(curl_handle, MEDIA_TOC_URL, media_rev); +		if(save_file(NULL, MEDIA_TOC_URL, media_rev)) +			return 1;  		med temp_med[MED_NO]; @@ -257,7 +316,8 @@ int update_contents_files(CURL *curl_handle, int temp)  		cur_identifiers(issue_xml, isstitle, &date);  		int med_no = -1; -		parsemediagz(media_rev, temp_med, &med_no); +		if(parsemediagz(media_rev, temp_med, &med_no)) +			return 1;  		/* BUG: this blanks title too... strange  		 * Until we can find why, just get the title again */  		cur_identifiers(issue_xml, isstitle, &date); @@ -398,15 +458,14 @@ int findnewestiss(iss ** issue, int no_of_issues)  void showusage()  {  	printf("Usage: getht -u -a -d -m -n -f [-t tocfile] -h -v\n"); +	printf("-u | --update                 Update contents files\n");  	printf("-a | --download-all           Download all issues\n");  	printf("-d | --download-latest        Download latest issue\n");  	printf("-m | --download-all-media     Download all media\n");  	printf("-n | --download-latest-media  Download latest issue's media\n"); -	printf("-f | --force                  Force redownloading of existent issues\n"); -	printf("-u | --update                 Update contents files\n"); +	printf("-f | --force                  Force re-download of existing files\n");  	printf("-t | --tocfile file           Use alternative contents xml file\n"); +	printf("-x | --mediatocfile file      Use alternative media contents xml file\n");  	printf("-h | --help                   Print this help message\n");  	printf("-v | --version                Print version information\n"); -	printf("         ---DEBUGGING--\n"); -	printf("-s                            Print structure information\n");  } @@ -77,6 +77,10 @@ int parsemediagz(char * media_path, med * cur_media, int * no_of_media)  		}  		strcpy(cur_line,""); /* reset cur_line */  	} + +	if(*no_of_media == -1) +		return 1; +  	return 0;  } @@ -132,7 +132,8 @@ iss ** parsemedia(char * filepath, iss ** issue, int * no_of_issues)  	xmlDocPtr media_file;  	xmlNodePtr node, itnode; -	ready_xml(filepath, "media", &media_file, &node); +	if(ready_xml(filepath, "media", &media_file, &node)) +		return NULL;  	*node = *node->xmlChildrenNode;  | 
