diff options
author | Nick White <arch@njw.me.uk> | 2007-05-03 00:31:22 +0000 |
---|---|---|
committer | Nick White <arch@njw.me.uk> | 2007-05-03 00:31:22 +0000 |
commit | f811c2d4823f95d7e90f25e0e7a98e5c5abcf3e2 (patch) | |
tree | 190283d4cf1efdd3ae5ba8ecaa0b6c5b5837bec9 /src/download.c | |
parent | 1edf37e3b0ad7b0556ba0902b5880044933ced66 (diff) |
Added Autotools, changed dir structure, added docs
Added (perhaps somewhat shaky) autotools support
Added tagging rules to junkify files generated by autotools
Added a directory structure
Updated README & INSTALL files to reflect changes
Wrote a man page
Changed version numbers in preparation for a release
git-archimport-id: getht@sv.gnu.org/getht--mainline--0.1--patch-23
Diffstat (limited to 'src/download.c')
-rw-r--r-- | src/download.c | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/src/download.c b/src/download.c new file mode 100644 index 0000000..1108b6d --- /dev/null +++ b/src/download.c @@ -0,0 +1,228 @@ +/* + * Copyright 2006 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 2 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, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#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); + +extern proxytype proxy_type; +extern char proxy_addr[STR_MAX]; +extern long proxy_port; +extern proxyauth proxy_auth; +extern char proxy_user[STR_MAX]; +extern char proxy_pass[STR_MAX]; +extern CURL *main_curl_handle; + +int save_file(CURL *curl_handle, char *url, char *filepath) +/* Save the file *url to *filepath */ +{ + printf("Downloading %s\n",url); + + if(curl_handle == NULL) + curl_handle = main_curl_handle; + + 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); + curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, file); + curl_easy_setopt(curl_handle, CURLOPT_READFUNCTION, read_func); + + if(proxy_type != NONE) + { + if(proxy_type == HTTP) + curl_easy_setopt(curl_handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); + else if(proxy_type == SOCKS4) + curl_easy_setopt(curl_handle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4); + else if(proxy_type == SOCKS5) + curl_easy_setopt(curl_handle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); + + curl_easy_setopt(curl_handle, CURLOPT_PROXY, proxy_addr); + + if(proxy_port) + curl_easy_setopt(curl_handle, CURLOPT_PROXYPORT, proxy_port); + + if(proxy_auth != NOAUTH) + { + if(proxy_auth == BASIC) + curl_easy_setopt(curl_handle, CURLOPT_PROXYAUTH, CURLAUTH_BASIC); + else if(proxy_auth == DIGEST) + curl_easy_setopt(curl_handle, CURLOPT_PROXYAUTH, CURLAUTH_DIGEST); + else if(proxy_auth == NTLM) + curl_easy_setopt(curl_handle, CURLOPT_PROXYAUTH, CURLAUTH_NTLM); + + if(proxy_user[0] && proxy_pass[0]) + { + char userpass[STR_MAX]; + snprintf(userpass, STR_MAX, "%s:%s", proxy_user, proxy_pass); + curl_easy_setopt(curl_handle, CURLOPT_PROXYUSERPWD, userpass); + } + } + } + + curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 0); + 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); + printf("Total downloaded: %lf\n",d); + + curl_easy_getinfo(curl_handle, CURLINFO_SPEED_DOWNLOAD, &d); + printf("Average speed downloaded: %lf\n",d); + + curl_easy_getinfo(curl_handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &d); + printf("Content Length: %lf\n",d); +*/ + fclose(file); + + printf("\n"); + } + 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, + double ultotal, double ulnow) +/* Print status information */ +{ + double frac; + frac = 100 * dlnow / dltotal; + printf("\rDownload progress: %3.0lf%% ", frac); + fflush(stdout); + + return 0; +} + +void downloadissue(CURL *curl_handle, char * directory, iss * issue, int force) +/* Download issue pointed to */ +{ + sec * cur_section; + char newdir[STR_MAX]; + char filename[STR_MAX]; + FILE * testfile; + + snprintf(newdir,STR_MAX,"%s/%i_%i-%i",directory, + issue->date.year,issue->date.firstmonth,issue->date.lastmonth); + + printf("Downloading issue entitled '%s' to '%s'\n",issue->title,newdir); + + if(!opendir(newdir)) + if(mkdir(newdir, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) + { + printf("Please enter the path of a directory to save issues in: "); + scanf("%s", newdir); /* TODO: incorporate tab-completion */ + } + + int count; + for(count = 0; count <= issue->no_of_sections; count++) + { + cur_section = issue->section[count]; + + snprintf(filename,STR_MAX,"%s/section_%i.pdf", newdir, cur_section->number); + if(!force){ + testfile = fopen(filename, "r"); + if(!testfile) + save_file(curl_handle, cur_section->uri, filename); + else + { + fclose(testfile); + printf("Skipping download of section %i\n", cur_section->number); + } + } + else + save_file(curl_handle, cur_section->uri, filename); + } +} + +void downloadmedia(CURL * curl_handle, char * directory, med * media, int force) +/* Download media pointed to. */ +{ + char newdir[STR_MAX], filename[STR_MAX], fn[STR_MAX]; + FILE * testfile; + + /* for the moment just save to down/media, in future save to issue directories + * (regardless of if they're occupied) */ + snprintf(newdir,STR_MAX,"%s/%s",directory,"media"); + + if(!opendir(newdir)) + if(mkdir(newdir, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) + { + printf("Please enter the path of a directory to save media in: "); + scanf("%s", newdir); /* TODO: incorporate GETTEXT */ + } + + /* get the position of the final forwardslash of the uri */ + int slashpos; + for(slashpos=strlen(media->uri); + slashpos>=0 && media->uri[slashpos] != '/'; + slashpos--); + + /* copy from there to fn */ + int tmp; + for(tmp=0, slashpos++; media->uri[slashpos]; tmp++, slashpos++) + fn[tmp] = media->uri[slashpos]; + fn[tmp] = '\0'; + + snprintf(filename,STR_MAX,"%s/%s", newdir, fn); + + if(!force){ + testfile = fopen(filename, "r"); + if(!testfile) + save_file(curl_handle, media->uri, filename); + else + { + fclose(testfile); + printf("Skipping download of media item %s\n", media->title); + } + } + else + save_file(curl_handle, media->uri, filename); +} |