summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO30
-rw-r--r--download.c11
-rw-r--r--getht.c93
-rw-r--r--mediarev.c4
-rw-r--r--mediaxml.c3
5 files changed, 104 insertions, 37 deletions
diff --git a/TODO b/TODO
index b8dffc3..c39a100 100644
--- a/TODO
+++ b/TODO
@@ -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
diff --git a/download.c b/download.c
index 099a65f..6e83afb 100644
--- a/download.c
+++ b/download.c
@@ -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,
diff --git a/getht.c b/getht.c
index 0087743..c2949ff 100644
--- a/getht.c
+++ b/getht.c
@@ -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");
}
diff --git a/mediarev.c b/mediarev.c
index 9877561..777e786 100644
--- a/mediarev.c
+++ b/mediarev.c
@@ -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;
}
diff --git a/mediaxml.c b/mediaxml.c
index b9631e2..54dd514 100644
--- a/mediaxml.c
+++ b/mediaxml.c
@@ -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;