diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/.gitignore | 5 | ||||
-rw-r--r-- | src/Makefile.am | 7 | ||||
-rw-r--r-- | src/cli.c | 79 | ||||
-rw-r--r-- | src/config.c | 172 | ||||
-rw-r--r-- | src/download.c | 276 | ||||
-rw-r--r-- | src/getht.c | 223 | ||||
-rw-r--r-- | src/getht.h | 52 | ||||
-rw-r--r-- | src/issue.h | 59 | ||||
-rw-r--r-- | src/issuemem.c | 148 | ||||
-rw-r--r-- | src/tocxml.c | 259 | ||||
-rw-r--r-- | src/xml.c | 60 |
11 files changed, 0 insertions, 1340 deletions
diff --git a/src/.gitignore b/src/.gitignore deleted file mode 100644 index 546ae33..0000000 --- a/src/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# ignore autotools creations -.deps - -# ignore built binary -getht diff --git a/src/Makefile.am b/src/Makefile.am deleted file mode 100644 index e6b2bc1..0000000 --- a/src/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -## A simple file to process with Automake, to produce Makefile.in - -bin_PROGRAMS = getht - -getht_SOURCES = config.c cli.c download.c getht.c issuemem.c \ - tocxml.c xml.c \ - getht.h issue.h version.h diff --git a/src/cli.c b/src/cli.c deleted file mode 100644 index e1bedcf..0000000 --- a/src/cli.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2006,2008 Nick White - * - * This file is part of GetHT - * - * GetHT is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GetHT is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GetHT. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdio.h> -#include <stdlib.h> - -#include "issue.h" -#include "getht.h" - -void list_issues(iss ** issue, int no_of_issues, int verbose) -{ - int iss_no, sec_no, it_no; - for(iss_no=0;iss_no<=no_of_issues;iss_no++) - { - printf("%2i: %s\n", iss_no, issue[iss_no]->title); - if(verbose >= 2) - printf(" Year: %i; Months: %i - %i\n",issue[iss_no]->date.year,issue[iss_no]->date.firstmonth,issue[iss_no]->date.lastmonth); - if(verbose >= 1) - { - for(sec_no=0; sec_no<=issue[iss_no]->no_of_sections; sec_no++) - { - printf(" %2i: %s\n", issue[iss_no]->section[sec_no]->number, - issue[iss_no]->section[sec_no]->title); - printf(" %s\n", issue[iss_no]->section[sec_no]->uri); - if(verbose >= 2) - { - for(it_no=0; - it_no<=issue[iss_no]->section[sec_no]->no_of_items; - it_no++) - { - printf(" pp %2i - %2i: %s\n", - issue[iss_no]->section[sec_no]->item[it_no]->firstpage, - issue[iss_no]->section[sec_no]->item[it_no]->lastpage, - issue[iss_no]->section[sec_no]->item[it_no]->title); - } - } - } - } - } -} - -void showusage() -{ - printf("Usage: getht [options] -a\n"); - printf(" or: getht [options] -d issno [-s secno]\n"); - printf(" or: getht [options] -l\n"); - printf("Downloads issue(s) of Hinduism Today\n\n"); - printf("Download options:\n"); - printf(" -a, --download-all Download all issues\n"); - printf(" -d, --download-issue issno Download issue number issno\n"); - printf(" -s, --download-section secno Download section number secno\n"); - printf(" -f, --force Force re-download of existing files\n"); - printf("Discovery options:\n"); - printf(" -l, --list-issues List available issues\n"); - printf(" -u, --update Update contents files\n"); - printf("Global options:\n"); - printf(" -q, --quiet Make output less verbose\n"); - printf(" -v, --verbose Make output more verbose\n"); - printf("Other options:\n"); - printf(" -h, --help Print this help message\n"); - printf(" -V, --version Print version information\n"); -} diff --git a/src/config.c b/src/config.c deleted file mode 100644 index b22e158..0000000 --- a/src/config.c +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright 2006,2008 Nick White - * - * This file is part of GetHT - * - * GetHT is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GetHT is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GetHT. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdio.h> -#include <string.h> - -#include "getht.h" - -#include <curl/curl.h> - -int loadconfig(char * getht_path, struct config * options) -/* Loads variables from config file to extern and passed - * variables. */ -{ - FILE * config_file; - char filepath[STR_MAX]; - - snprintf(filepath, STR_MAX, "%s/config.ini", getht_path); - - if((config_file = fopen(filepath,"r")) == NULL) - { - fprintf(stderr,"Cannot open file %s for reading.\n",filepath); - return 1; - } - - char parameter[80], option[80]; - while(!feof(config_file)) - { - fscanf(config_file, "%s = %s", option, parameter); - - if(option[0] == '#'); /* ignore lines beginning with a hash */ - else if(!strcmp(option, "savepath")) - strncpy(options->save_path, parameter, STR_MAX); - else if(!strcmp(option, "startup_check")) - options->startup_check = atoi(parameter); - else if(!strcmp(option, "toc_uri")) - strncpy(options->issue_uri, parameter, STR_MAX); - else if(!strcmp(option, "proxy_type")) - { - if(!strcmp(parameter, "http")) - options->proxy.type = CURLPROXY_HTTP; - else if(!strcmp(parameter, "socks4")) - options->proxy.type = CURLPROXY_SOCKS4; - else if(!strcmp(parameter, "socks5")) - options->proxy.type = CURLPROXY_SOCKS5; - else - fprintf(stderr, - "Proxy type %s not known, please use either http, socks4 or socks5\n", - parameter); - } - else if(!strcmp(option, "proxy_address")) - strncpy(options->proxy.address, parameter, STR_MAX); - else if(!strcmp(option, "proxy_port")) - options->proxy.port = (long) atoi(parameter); - else if(!strcmp(option, "proxy_auth")) - { - if(!strcmp(parameter, "basic")) - options->proxy.auth = CURLAUTH_BASIC; - else if(!strcmp(parameter, "digest")) - options->proxy.auth = CURLAUTH_DIGEST; - else if(!strcmp(parameter, "ntlm")) - options->proxy.auth = CURLAUTH_NTLM; - else - fprintf(stderr, - "config.ini: Proxy authentication method %s not known, please use basic, digest or ntlm", - parameter); - } - else if(!strcmp(option, "proxy_user")) - strncpy(options->proxy.user, parameter, STR_MAX); - else if(!strcmp(option, "proxy_pass")) - strncpy(options->proxy.pass, parameter, STR_MAX); - else - fprintf(stderr, "config.ini: Option '%s' not recognised, ignoring\n", option); - } - - fclose(config_file); - - return 0; -} - -int writefreshconfig(char * getht_path, struct config * options) -/* Write a new config file according to extern and passed variables. */ -{ - FILE * config_file; - char filepath[STR_MAX]; - - snprintf(filepath, STR_MAX, "%s/config.ini", getht_path); - - if((config_file = fopen(filepath,"w")) == NULL) - { - fprintf(stderr,"Cannot open file %s for writing.\n",filepath); - return 1; - } - else - fprintf(stdout,"Writing a fresh config file to %s.\n",filepath); - - if(options->save_path[0]) - fprintf(config_file, "%s = %s\n", "savepath", options->save_path); - if(options->startup_check) - fprintf(config_file, "%s = %i\n", "startup_check", options->startup_check); - if(options->issue_uri[0]) - fprintf(config_file, "%s = %s\n", "toc_uri", options->issue_uri); - if(options->proxy.type) - { - if(options->proxy.type == CURLPROXY_HTTP) - fprintf(config_file, "%s = %s\n", "proxy_type", "http"); - else if(options->proxy.type == CURLPROXY_SOCKS4) - fprintf(config_file, "%s = %s\n", "proxy_type", "socks4"); - else if(options->proxy.type == CURLPROXY_SOCKS5) - fprintf(config_file, "%s = %s\n", "proxy_type", "socks5"); - } - if(options->proxy.address[0]) - fprintf(config_file, "%s = %s\n", "proxy_address", options->proxy.address); - if(options->proxy.port) - fprintf(config_file, "%s = %i\n", "proxy_port", options->proxy.port); - if(options->proxy.auth) - { - if(options->proxy.auth = CURLAUTH_BASIC) - fprintf(config_file, "%s = %s\n", "proxy_auth", "basic"); - else if(options->proxy.auth = CURLAUTH_DIGEST) - fprintf(config_file, "%s = %s\n", "proxy_auth", "digest"); - else if(options->proxy.auth = CURLAUTH_NTLM) - fprintf(config_file, "%s = %s\n", "proxy_auth", "ntlm"); - } - if(options->proxy.user[0]) - fprintf(config_file, "%s = %s\n", "proxy_user", options->proxy.user); - if(options->proxy.pass[0]) - fprintf(config_file, "%s = %s\n", "proxy_pass", options->proxy.pass); - - fclose(config_file); - - return 0; -} - -int updateconfig(char * getht_path, struct config * options) -/* Read existing config file, and rewrite any variables which differ - * in memory. */ -{ - FILE * config_file; - char filepath[STR_MAX]; - - snprintf(filepath, STR_MAX, "%s/config.ini", getht_path); - - if((config_file = fopen(filepath,"rw")) == NULL) - { - fprintf(stderr,"Cannot open file %s for reading/writing.\n",filepath); - return 1; - } - - /* Not yet implemented */ - - fclose(config_file); - - return 1; -} diff --git a/src/download.c b/src/download.c deleted file mode 100644 index a6dcc49..0000000 --- a/src/download.c +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright 2006,2008 Nick White - * - * This file is part of GetHT - * - * GetHT is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GetHT is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GetHT. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdio.h> -#include <string.h> -#include <sys/stat.h> -#include <curl/curl.h> -#include <curl/types.h> -#include <curl/easy.h> - -#include "getht.h" -#include "issue.h" - -int read_func(void *ptr, size_t size, size_t nmemb, FILE *stream) - { return fread(ptr, size, nmemb, stream); } -int write_func(void *ptr, size_t size, size_t nmemb, FILE *stream) - { return fwrite(ptr, size, nmemb, stream); } -int update_progress(void *data, double dltotal, double dlnow, - double ultotal, double ulnow); - -int save_file(char *uri, char *filepath, char *filetitle, long resume_offset, struct config * options) -/* Save the file *uri to *filepath */ -{ - if(!options->quiet) - { - printf("Downloading %s ",filetitle); - fflush(stdout); - } - - if(options->curl_handle) { - FILE *file; - file = fopen(filepath, resume_offset?"a":"w"); - if(!file) - { - fprintf(stderr,"Error: cannot open file %s for writing.\n",filepath); - return 1; - } - - curl_easy_setopt(options->curl_handle, CURLOPT_URL, uri); - curl_easy_setopt(options->curl_handle, CURLOPT_READFUNCTION, read_func); - curl_easy_setopt(options->curl_handle, CURLOPT_WRITEFUNCTION, write_func); - curl_easy_setopt(options->curl_handle, CURLOPT_WRITEDATA, file); - - if(options->proxy.type) - { - curl_easy_setopt(options->curl_handle, CURLOPT_PROXYTYPE, options->proxy.type); - curl_easy_setopt(options->curl_handle, CURLOPT_PROXY, options->proxy.address); - if(options->proxy.port) - curl_easy_setopt(options->curl_handle, CURLOPT_PROXYPORT, options->proxy.port); - if(options->proxy.auth) - curl_easy_setopt(options->curl_handle, CURLOPT_PROXYAUTH, options->proxy.auth); - if(options->proxy.user[0] && options->proxy.pass[0]) - { - char userpass[STR_MAX]; - snprintf(userpass, STR_MAX, "%s:%s", options->proxy.user, options->proxy.pass); - curl_easy_setopt(options->curl_handle, CURLOPT_PROXYUSERPWD, userpass); - } - } - - if(!options->quiet) - { - curl_easy_setopt(options->curl_handle, CURLOPT_NOPROGRESS, 0); - curl_easy_setopt(options->curl_handle, CURLOPT_PROGRESSFUNCTION, update_progress); - curl_easy_setopt(options->curl_handle, CURLOPT_PROGRESSDATA, &resume_offset); - } - else - curl_easy_setopt(options->curl_handle, CURLOPT_NOPROGRESS, 1); - - curl_easy_setopt(options->curl_handle, CURLOPT_RESUME_FROM, resume_offset); - - /* create a buffer to hold any curl errors */ - char errorinfo[CURL_ERROR_SIZE]; - curl_easy_setopt(options->curl_handle, CURLOPT_ERRORBUFFER, errorinfo); - - if(curl_easy_perform(options->curl_handle)) - { - remove(filepath); - fprintf(stderr,"\nError, could not download %s: %s\n",uri, errorinfo); - return 1; - } - - fclose(file); - - if(!options->quiet) - printf("\rDownloaded %s \n",filetitle); - } - else { - fprintf(stderr,"Error: curl failed to initialise.\n"); - printf("Could not download %s\n",uri); - return 1; - } - return 0; -} - -int update_progress(void *data, double dltotal, double dlnow, - double ultotal, double ulnow) -/* Print status information */ -{ - double frac; - long *startsize = NULL; - - startsize = (long *)data; - long cur = (long) dlnow + *startsize; - long total = (long) dltotal + *startsize; - - if(cur > 0) - frac = 100 * (double) cur / (double) total; - else - frac = 0; - - printf("\b\b\b\b\b\b\b: %3.0lf%% ", frac); - fflush(stdout); - - return 0; -} - -double getremotefilesize(char *uri, struct config * options) -{ - double filesize; - - if(options->curl_handle) { - - curl_easy_setopt(options->curl_handle, CURLOPT_URL, uri); - curl_easy_setopt(options->curl_handle, CURLOPT_READFUNCTION, read_func); - - /* don't download or return either body or header */ - curl_easy_setopt(options->curl_handle, CURLOPT_NOBODY, 1); - curl_easy_setopt(options->curl_handle, CURLOPT_HEADER, 0); - - if(options->proxy.type) - { - curl_easy_setopt(options->curl_handle, CURLOPT_PROXYTYPE, options->proxy.type); - curl_easy_setopt(options->curl_handle, CURLOPT_PROXY, options->proxy.address); - if(options->proxy.port) - curl_easy_setopt(options->curl_handle, CURLOPT_PROXYPORT, options->proxy.port); - if(options->proxy.auth) - curl_easy_setopt(options->curl_handle, CURLOPT_PROXYAUTH, options->proxy.auth); - if(options->proxy.user[0] && options->proxy.pass[0]) - { - char userpass[STR_MAX]; - snprintf(userpass, STR_MAX, "%s:%s", options->proxy.user, options->proxy.pass); - curl_easy_setopt(options->curl_handle, CURLOPT_PROXYUSERPWD, userpass); - } - } - - curl_easy_setopt(options->curl_handle, CURLOPT_NOPROGRESS, 1); - - if(curl_easy_perform(options->curl_handle)) - filesize = -1; - - curl_easy_getinfo(options->curl_handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &filesize); - - } - else - filesize = -1; - - curl_easy_reset(options->curl_handle); - return filesize; -} - -char * checkdir(char * dir) -/* Checks that dir is writable. If necessary prompt - * the user for a new directory and return it. */ -{ - int dirchanged = 0; - - if(!opendir(dir)) - while(mkdir(dir, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) - { - fprintf(stderr,"Cannot create directory %s\n", dir); - printf("Please enter the path of a save directory: "); - scanf("%s", dir); - dirchanged = 1; - } - - if(dirchanged) - return dir; - else - return 0; -} - -char * getissuedir(struct config * options, iss * issue) -/* Returns and prepares download directory */ -{ - char * newsavedir; - char * newdir; - - newsavedir = malloc(STR_MAX); - newdir = malloc(STR_MAX); - - /* Check that main save path is ok */ - newsavedir = checkdir(options->save_path); - /* Save the new save path if it changed */ - if(newsavedir) - { - char getht_path[STR_MAX]; - snprintf(getht_path,STR_MAX,"%s/.getht",getenv("HOME")); - updateconfig(getht_path, &options); - } - - snprintf(newdir,STR_MAX,"%s/%i_%i-%i",options->save_path, - issue->date.year,issue->date.firstmonth,issue->date.lastmonth); - - /* Check that specific issue path is ok */ - checkdir(newdir); - - return newdir; -} - -void downloadsection(struct config * options, sec * section, char * downdir, int force) -/* Download section pointed to */ -{ - char filename[STR_MAX]; - char filepath[STR_MAX]; - - snprintf(filename,STR_MAX,"section_%i.pdf", section->number); - snprintf(filepath,STR_MAX,"%s/%s", downdir, filename); - - if(!force){ - struct stat fileinfo; - /* see if local file exists */ - if(stat(filepath, &fileinfo)) - save_file(section->uri, filepath, filename, 0, options); - else - { - /* get size of local file */ - long localsize = 0; - localsize = (long) fileinfo.st_size; - - /* get size of remote file */ - long remotesize = 0; - remotesize = (long) getremotefilesize(section->uri, options); - - /* if size of local file != size of remote file, resume */ - if(remotesize > 0 && localsize < remotesize) - save_file(section->uri, filepath, filename, localsize, options); - else - { - if(!options->quiet) - printf("Skipping download of completed section %i\n", section->number); - } - } - } - else - save_file(section->uri, filepath, filename, 0, options); -} - -void downloadissue(struct config * options, iss * issue, int force) -/* Download issue pointed to */ -{ - char downdir[STR_MAX]; - strncpy(downdir, getissuedir(options, issue), STR_MAX); - - printf("Downloading %s to %s\n",issue->title, downdir); - - int count; - for(count = 0; count <= issue->no_of_sections; count++) - downloadsection(options, issue->section[count], downdir, force); -} diff --git a/src/getht.c b/src/getht.c deleted file mode 100644 index de72384..0000000 --- a/src/getht.c +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright 2006,2008 Nick White - * - * This file is part of GetHT - * - * GetHT is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GetHT is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GetHT. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <config.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <getopt.h> -#include <string.h> -#include <sys/stat.h> -#include <curl/curl.h> - -#include "issue.h" -#include "getht.h" - -int update_contents_files(struct config * options); - -int main(int argc, char *argv[]) -{ - struct config options; - char getht_path[STR_MAX]; - - /* initialise appropriate options vars */ - options.startup_check = 0; - options.quiet = 0; - options.verbose = 0; - options.proxy.type = 0; - options.proxy.auth = 0; - options.proxy.address[0] = '\0'; - options.proxy.port = 0; - options.proxy.user[0] = '\0'; - options.proxy.pass[0] = '\0'; - - /* Define & set up paths */ - snprintf(getht_path,STR_MAX,"%s/.getht",getenv("HOME")); - - if(!opendir(getht_path)) - if(mkdir(getht_path, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) - { - fprintf(stderr,"Cannot open/create directory %s\n",getht_path); - printf("Please enter the path of a directory to save settings in: "); - scanf("%s", getht_path); - } - - snprintf(options.toc_xml,STR_MAX,"%s/%s",getht_path,ISS_XML_FILE); - - strncpy(options.issue_uri,XML_TOC_URI,STR_MAX); - - snprintf(options.save_path,STR_MAX,"%s/hinduism_today",getenv("HOME")); - - int downall = 0; - int downissue = 0, downissueno = -1; - int downsection = 0, downsectionno = -1; - int listissues = 0; - int force = 0; - int option = 0; - - if(loadconfig(getht_path, &options) != 0) - writefreshconfig(getht_path, &options); - - /* Parse command line options */ - char c; - static struct option long_opts[] = - { - {"download-all", no_argument, 0, 'a'}, - {"download-issue", required_argument, 0, 'd'}, - {"download-section", required_argument, 0, 's'}, - {"force", no_argument, 0, 'f'}, - {"list-issues", no_argument, 0, 'l'}, - {"quiet", no_argument, 0, 'q'}, - {"update", no_argument, 0, 'u'}, - {"help", no_argument, 0, 'h'}, - {"verbose", no_argument, 0, 'v'}, - {"version", no_argument, 0, 'V'}, - {0, 0, 0, 0} - }; - while((c = getopt_long(argc, argv, "ad:fs:hluqvV", long_opts, NULL)) != -1) { - switch(c) { - case 'a': - downall = 1; - downissue = 1; - option = 1; - break; - case 'd': - downissue = 1; - downissueno = atoi(optarg); - option = 1; - break; - case 's': - downsection = 1; - downsectionno = atoi(optarg); - option = 1; - break; - case 'l': - listissues = 1; - option = 1; - break; - case 'f': - force = 1; - option = 1; - break; - case 'u': - options.startup_check = 1; - option = 1; - break; - case 'h': - showusage(); - return 0; - break; - case 'q': - options.quiet = 1; - option = 1; - break; - case 'v': - options.verbose++; - option = 1; - break; - case 'V': - printf("%s version: %s\n",PACKAGE_NAME, PACKAGE_VERSION); - option = 1; - return 0; - break; - } - } - - if(!option) - { - showusage(); - return 0; - } - - options.curl_handle = curl_easy_init(); - - if(options.startup_check) - { - if(update_contents_files(&options)) - fprintf(stderr,"Could not update contents files\n"); - } - - /* Parse TOC, filling issue structure */ - - iss **issue; - int no_of_issues = -1; - int i; - - if(downissue || listissues) - { - issue = parsetoc(options.toc_xml, &no_of_issues); - - if(!issue) - { - if(!options.startup_check) - { - printf("Cannot open contents file, trying to update contents\n"); - if(update_contents_files(&options)) - return 1; - issue = parsetoc(options.toc_xml, &no_of_issues); - } - else - { - printf("Cannot open contents file, try running `getht --update`\n"); - return 1; - } - } - - if(downall) - { - for(i = 0; i < no_of_issues; i++) - downloadissue(&options, issue[i], force); - } - else if(downissueno >= 0 && downissueno <= no_of_issues) - { - if(downsection && downsectionno >= 0 && downsectionno <= issue[downissueno]->no_of_sections) - { - char downdir[STR_MAX]; - sec * cursec; - strncpy(downdir, (char *) getissuedir(&options, issue[downissueno]), STR_MAX); - cursec = issue[downissueno]->section[downsectionno]; - - printf("Downloading %s to %s\n", cursec->title, downdir); - - downloadsection(&options, cursec, &downdir, force); - } - else - downloadissue(&options, issue[downissueno], force); - } - } - - - if(listissues) - list_issues(issue, no_of_issues, options.verbose); - - /* Ensure curl cleans itself up */ - curl_easy_cleanup(options.curl_handle); - - return 0; -} - -int update_contents_files(struct config * options) -/* Returns 0 on success, 1 on failure */ -{ - if(save_file(options->issue_uri, options->toc_xml, "contents", 0, options)) - return 1; - else - return 0; -} diff --git a/src/getht.h b/src/getht.h deleted file mode 100644 index 6a64b6e..0000000 --- a/src/getht.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2006,2008 Nick White - * - * This file is part of GetHT - * - * GetHT is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GetHT is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GetHT. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#define XML_TOC_URI "http://www.hinduismtoday.com/digital/htde_toc.xml" - -#define ISS_XML_FILE "htde_toc.xml" - -#define STR_MAX 512 - -#include <curl/curl.h> - -struct proxy_options { - char type; - char auth; - char address[STR_MAX]; - long port; - char user[STR_MAX]; - char pass[STR_MAX]; -}; - -struct config { - char toc_xml[STR_MAX]; - char issue_uri[STR_MAX]; - - char save_path[STR_MAX]; - - struct proxy_options proxy; - - int startup_check; - - int verbose; - int quiet; - - CURL *curl_handle; -}; diff --git a/src/issue.h b/src/issue.h deleted file mode 100644 index 44f2601..0000000 --- a/src/issue.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2006,2008 Nick White - * - * This file is part of GetHT - * - * GetHT is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GetHT is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GetHT. If not, see <http://www.gnu.org/licenses/>. - * - */ - -typedef struct -{ - int year; - int firstmonth; - int lastmonth; -} issdates; - -typedef struct -{ - int firstpage; - int lastpage; - char * title; -} it; - -typedef struct -{ - char uri[512]; - char title[512]; - int number; - int size; - it ** item; - int no_of_items; -} sec; - -typedef struct -{ - char preview_uri[512]; - char title[512]; - int size; - issdates date; - sec ** section; - int no_of_sections; -} iss; - -iss ** parsetoc(char *filepath, int * iss_no); - -iss ** assignnew_iss(iss ** issue, int *no_of_issues); -sec ** assignnew_sec(sec ** section, int * no_of_sections); -it ** assignnew_it(it ** item, int * no_of_items); diff --git a/src/issuemem.c b/src/issuemem.c deleted file mode 100644 index 354c7d9..0000000 --- a/src/issuemem.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright 2006,2008 Nick White - * - * This file is part of GetHT - * - * GetHT is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GetHT is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GetHT. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdio.h> -#include <stdlib.h> - -#include "issue.h" - -void nogo_mem() -/* called if memory assignation fails - * TODO: handle freeing of memory to avoid leaks */ -{ - fprintf(stderr, "Could not assign memory, exitting\n"); - exit(1); -} - -iss ** assignnew_iss(iss ** issue, int *no_of_issues) -/* assign memory for new issue */ -{ - iss ** tmp = NULL; - - if(*no_of_issues < 0) - { /* make issue** a new array of issue pointers */ - if( (tmp = malloc(sizeof(iss *))) == NULL ) - nogo_mem(); - } - else - { /* add a new pointer to issue pointer list */ - if( (tmp = realloc(issue, sizeof(iss *) + (((*no_of_issues)+1) * sizeof(iss *)))) == NULL ) - nogo_mem(); - } - - (*no_of_issues)++; - - /* make new array item a pointer to issue */ - if( (tmp[*no_of_issues] = malloc(sizeof(iss))) == NULL ) - nogo_mem(); - - return tmp; -} - -sec ** assignnew_sec(sec ** section, int *no_of_sections) -/* assign memory for new section */ -{ - sec ** tmp = NULL; - - if(*no_of_sections < 0) - { /* make **section a new array of section pointers */ - if( (tmp = malloc(sizeof(sec *))) == NULL ) - nogo_mem(); - } - else - { /* add a new pointer to section pointer list */ - if( (tmp = realloc(section, sizeof(sec *) + (((*no_of_sections)+1) * sizeof(sec *)))) == NULL ) - nogo_mem(); - } - - (*no_of_sections)++; - - /* make new array item a pointer to issue */ - if( (tmp[*no_of_sections] = malloc(sizeof(sec))) == NULL ) - nogo_mem(); - - return tmp; -} - -it ** assignnew_it(it ** item, int * no_of_items) -{ - it ** tmp = NULL; - - if(*no_of_items < 0) - { /* make **item a new array of item pointers */ - if( (tmp = malloc(sizeof(it *))) == NULL ) - nogo_mem(); - } - else - { /* add a new pointer to item pointer list */ - if( (tmp = realloc(item, sizeof(it *) + (((*no_of_items)+1) * sizeof(it *)))) == NULL ) - nogo_mem(); - } - - (*no_of_items)++; - - /* make new array item a pointer to item */ - if( (tmp[*no_of_items] = malloc(sizeof(it))) == NULL ) - nogo_mem(); - - return tmp; -} - -int issuesort(iss ** issue, int no_of_issues) -/* does a basic bubble sort, by date, returning sorted issue */ -{ - int sortindex[no_of_issues]; - - int count1, count2, temp; - - for(count1 = 0; count1 <= no_of_issues; count1++) - sortindex[count1] = count1; - - /* find correct order of issues using a bubble sort */ - for(count1 = 0; count1 <=no_of_issues; count1++) - { - for(count2 = 0; count2 < no_of_issues; count2++) - { - if(issue[sortindex[count2]]->date.year < issue[sortindex[count2+1]]->date.year) - { - temp = sortindex[count2]; - sortindex[count2] = sortindex[count2+1]; - sortindex[count2+1] = temp; - } - else if((issue[sortindex[count2]]->date.year == issue[sortindex[count2+1]]->date.year) && - (issue[sortindex[count2]]->date.firstmonth < issue[sortindex[count2+1]]->date.firstmonth)) - { - temp = sortindex[count2]; - sortindex[count2] = sortindex[count2+1]; - sortindex[count2+1] = temp; - } - } - } - - iss * sortedissue[no_of_issues]; - - for(count1 = 0; count1 <= no_of_issues; count1++) - sortedissue[count1] = issue[sortindex[count1]]; - - for(count1 = 0; count1 <= no_of_issues; count1++) - issue[count1] = sortedissue[count1]; - - return 0; -} diff --git a/src/tocxml.c b/src/tocxml.c deleted file mode 100644 index 60ef31b..0000000 --- a/src/tocxml.c +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright 2006,2008 Nick White - * - * This file is part of GetHT - * - * GetHT is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GetHT is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GetHT. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <libxml/xmlmemory.h> -#include <libxml/parser.h> - -#include "issue.h" -#include "getht.h" - -iss ** parsetoc(char *filepath, int * iss_no); -int parseissue(xmlDocPtr file, xmlNodePtr node, iss * cur_issue); -void parsesection(xmlDocPtr file, xmlNodePtr node, sec * cur_section); - -void tokenise_hyphons(char to_token[10], int * first, int * last); - -int no_of_issues; - -iss ** parsetoc(char *filepath, int * iss_no) -/* starts parsing of xml to issue structure */ -{ - xmlDocPtr file; - xmlNodePtr node; - - if(ready_xml(filepath, "issues", &file, &node)) - return NULL; - - *node = *node->xmlChildrenNode; - - no_of_issues = -1; - - iss ** issue = NULL; - - int year; - - xmlNodePtr cnode; - - while(node != NULL) - { - if(!xmlStrncmp(node->name,(char *) "year",4)) - { - cnode = node->children; - while(cnode != NULL) - { - if(!xmlStrncmp(cnode->name,(char *) "issue",5)) - { - /* assign memory for the new issue */ - issue = assignnew_iss(issue, &no_of_issues); - - /* setup issue globals */ - issue[no_of_issues]->no_of_sections = -1; - issue[no_of_issues]->date.year = - atoi( (const char *)(xmlStrsub(node->name,5,4)) ); - tokenise_hyphons( - xmlStrsub(cnode->name,6,5), - &(issue[no_of_issues]->date.firstmonth), - &(issue[no_of_issues]->date.lastmonth)); - - /* parse the issue */ - parseissue(file, cnode, issue[no_of_issues]); - } - cnode = cnode->next; - } - } - node = node->next; - } - - xmlFreeDoc(file); - - *iss_no = no_of_issues; - - issuesort(issue, no_of_issues); - - return issue; -} - -int parseissue(xmlDocPtr file, xmlNodePtr node, iss * cur_issue) -/* parses issue from xml, saving in cur_issue structure */ -{ - strncpy(cur_issue->title, (char *) xmlGetProp(node, "title"), STR_MAX); - strncpy(cur_issue->preview_uri, (char *) xmlGetProp(node, "coverlink"), STR_MAX); - - node = node->xmlChildrenNode; - - while(node != NULL){ - if(!xmlStrncmp(node->name, (char *) "section",7) || - !xmlStrcmp(node->name, (const xmlChar *) "cover")) - { - /* assign memory for new section */ - cur_issue->section = - assignnew_sec(cur_issue->section, &(cur_issue->no_of_sections)); - - /* setup section globals */ - cur_issue->section[cur_issue->no_of_sections]->no_of_items = -1; - - /* parse the section */ - parsesection(file, node, cur_issue->section[cur_issue->no_of_sections]); - } - node = node->next; - } - - return 0; -} - -void parsesection(xmlDocPtr file, xmlNodePtr node, sec * cur_section) -/* parses section xml, filling cur_section structure */ -{ - it * cur_item = NULL; - - strncpy(cur_section->uri, (char *) xmlGetProp(node, "pdflink"), STR_MAX); - strncpy(cur_section->title, (char *) xmlGetProp(node, "title"), STR_MAX); - - if(!xmlStrcmp(node->name, (const xmlChar *) "cover")) - cur_section->number = 0; - else - cur_section->number = atoi( (const char *)(xmlStrsub(node->name,8,1)) ); - - node = node->xmlChildrenNode; - - char * pagenums; - - it ** tmp = NULL; - - while(node != NULL) - { - if(!xmlStrcmp(node->name, (const xmlChar *) "item")) - { - if(xmlNodeListGetString(file, node->xmlChildrenNode, 1) != NULL) - /* ignore items without titles */ - { - /* assign memory for new item */ - cur_section->item = - assignnew_it( cur_section->item, &(cur_section->no_of_items)); - - cur_item = cur_section->item[cur_section->no_of_items]; - - /* parse item */ - cur_item->title = xmlNodeListGetString(file, node->xmlChildrenNode, 1); - if(pagenums = (char *) xmlGetProp(node, "pages")) - tokenise_hyphons(pagenums, &(cur_item->firstpage), &(cur_item->lastpage)); - else - { - cur_item->firstpage = 0; - cur_item->lastpage = 0; - } - } - } - node = node->next; - } -} - -void tokenise_hyphons(char to_token[10], int * first, int * last) -/* splits string to_token, filling positions passed */ -{ - char token[10]; - char * tmp; - - tmp = token; - - while(*to_token != '-' && *to_token) - { - *tmp = *to_token; - to_token++; tmp++; - } - - *first = atoi(token); - - if(!*to_token) - *last = *first; - else - { - to_token++; /* advance past '-' */ - tmp = token; /* reset tmp */ - while(*to_token) - { - *tmp = *to_token; - tmp++; to_token++; - } - *last = atoi(token); - } -} - -int cur_identifiers(char * filepath, char * title, issdates * date) -/* parses xml file to ascertain current issue title and date */ -{ - xmlDocPtr file; - - if((file = xmlReadFile(filepath, "ISO-8859-1", 0)) == NULL) - { - return 1; - } - - xmlNodePtr node,cnode; - - node = xmlDocGetRootElement(file); - - if(node == NULL) - { - fprintf(stderr,"Error: xml file %s has no root element",filepath); - xmlFreeDoc(file); - return 1; - } - - if(xmlStrcmp(node->name, (const xmlChar *) "issues")) - { - fprintf(stderr,"Document of the wrong type, root node is '%s' (expected 'issues').\n",(char *) node->name); - fprintf(stderr,"Continuing regardless...\n"); - } - - /* Now that's all sorted, let's do some work */ - - node = node->xmlChildrenNode; - - xmlChar *temp; - while(node != NULL) - { - if(!xmlStrncmp(node->name,(char *) "year",4)) - { - cnode = node->children; - while(cnode != NULL) - { - if(!xmlStrncmp(cnode->name,(char *) "issue",5)) - { - temp = xmlGetProp(cnode, "current"); - if(temp) - { - strncpy(title, (char *) xmlGetProp(cnode, "title"), STR_MAX); - date->year = atoi( (const char *)(xmlStrsub(node->name,5,4)) ); - tokenise_hyphons(xmlStrsub(cnode->name,6,5), &(date->firstmonth), &(date->lastmonth)); - return 0; - } - } - cnode = cnode->next; - } - } - node = node->next; - } - - return 0; -} diff --git a/src/xml.c b/src/xml.c deleted file mode 100644 index 9d59cf4..0000000 --- a/src/xml.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2006,2008 Nick White - * - * This file is part of GetHT - * - * GetHT is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GetHT is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GetHT. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdio.h> -#include <unistd.h> -#include <libxml/xmlmemory.h> -#include <libxml/parser.h> - -#include "getht.h" -#include "issue.h" - -int ready_xml(char * filepath, char * rootnode, xmlDocPtr * file, xmlNodePtr * node) -/* Opens filepath, filling nec pointers with essential information. */ -{ - if(access(filepath, R_OK) != 0) - return 1; - - if((*file = xmlReadFile(filepath, "ISO-8859-1", 0)) == NULL) - { - fprintf(stderr, "Error: cannot open xml file %s\n", filepath); - return 1; - } - - *node = xmlDocGetRootElement(*file); - - if(*node == NULL) - { - fprintf(stderr,"Error: xml file %s has no root element",filepath); - xmlFreeDoc(*file); - return 1; - } - - char * test; - test = (char *) (*node)->name; - - if(xmlStrcmp((*node)->name, (const xmlChar *) rootnode)) - { - fprintf(stderr,"Document of the wrong type, root node is '%s' (expected '%s').\n",(char *) (*node)->name, rootnode); - fprintf(stderr,"Continuing regardless...\n"); - } - - return 0; -} |