X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Finternet.cc;h=aafdf3a839a342b99944c2c20bdd14a9c9c56b82;hb=7e4d7d9e4f146576a63c6ab1be9bca5a79b507d9;hp=1c61e96e3bebe3eeced3e1a9a3717ff737675fde;hpb=0390c42a7fc648a116ac3fd0417eac92dfe79f6d;p=dcpomatic.git diff --git a/src/lib/internet.cc b/src/lib/internet.cc index 1c61e96e3..aafdf3a83 100644 --- a/src/lib/internet.cc +++ b/src/lib/internet.cc @@ -1,30 +1,33 @@ /* - Copyright (C) 2014 Carl Hetherington + Copyright (C) 2014-2015 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic 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. - This program is distributed in the hope that it will be useful, + DCP-o-matic 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 this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ -#include +#include "scoped_temporary.h" +#include "compose.hpp" +#include "exceptions.h" +#include +#include #include #include #include -#include -#include -#include "util.h" -#include "safe_stringstream.h" +#include +#include #include "i18n.h" @@ -32,6 +35,7 @@ using std::string; using std::list; using boost::optional; using boost::function; +using boost::algorithm::trim; static size_t get_from_zip_url_data (void* buffer, size_t size, size_t nmemb, void* stream) @@ -45,17 +49,22 @@ get_from_zip_url_data (void* buffer, size_t size, size_t nmemb, void* stream) * @param load Function passed a (temporary) filesystem path of the unpacked file. */ optional -get_from_zip_url (string url, string file, function load) +get_from_zip_url (string url, string file, bool pasv, function load) { /* Download the ZIP file to temp_zip */ CURL* curl = curl_easy_init (); curl_easy_setopt (curl, CURLOPT_URL, url.c_str ()); - + ScopedTemporary temp_zip; FILE* f = temp_zip.open ("wb"); curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, get_from_zip_url_data); curl_easy_setopt (curl, CURLOPT_WRITEDATA, f); curl_easy_setopt (curl, CURLOPT_FTP_USE_EPSV, 0); + curl_easy_setopt (curl, CURLOPT_FTP_USE_EPRT, 0); + if (!pasv) { + curl_easy_setopt (curl, CURLOPT_FTPPORT, "-"); + } + /* Maximum time is 20s */ curl_easy_setopt (curl, CURLOPT_TIMEOUT, 20); @@ -64,21 +73,21 @@ get_from_zip_url (string url, string file, function (_("Could not open downloaded ZIP file")); } - + struct zip_file* zip_file = zip_fopen (zip, file.c_str(), 0); if (!zip_file) { return optional (_("Unexpected ZIP file contents")); } - + ScopedTemporary temp_cert; f = temp_cert.open ("wb"); char buffer[4096]; @@ -90,12 +99,11 @@ get_from_zip_url (string url, string file, function (); } - static size_t ftp_ls_data (void* buffer, size_t size, size_t nmemb, void* data) { @@ -104,15 +112,15 @@ ftp_ls_data (void* buffer, size_t size, size_t nmemb, void* data) for (size_t i = 0; i < (size * nmemb); ++i) { *s += b[i]; } - return nmemb; + return size * nmemb; } list -ftp_ls (string url) +ftp_ls (string url, bool pasv) { CURL* curl = curl_easy_init (); if (!curl) { - return list (); + throw NetworkError ("could not set up curl"); } if (url.substr (url.length() - 1, 1) != "/") { @@ -129,20 +137,30 @@ ftp_ls (string url) curl_easy_setopt (curl, CURLOPT_WRITEDATA, &ls_raw); curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, ftp_ls_data); curl_easy_setopt (curl, CURLOPT_FTP_USE_EPSV, 0); + curl_easy_setopt (curl, CURLOPT_FTP_USE_EPRT, 0); + curl_easy_setopt (curl, CURLOPT_VERBOSE, 1); + if (!pasv) { + curl_easy_setopt (curl, CURLOPT_FTPPORT, "-"); + } CURLcode const r = curl_easy_perform (curl); if (r != CURLE_OK) { - return list (); + curl_easy_cleanup (curl); + throw NetworkError (curl_easy_strerror (r)); } - SafeStringStream s (ls_raw); list ls; - while (s.good ()) { - string const line = s.getline (); - if (line.length() > 55) { - string const file = line.substr (55); - if (file != "." && file != "..") { - ls.push_back (file); + string line; + for (size_t i = 0; i < ls_raw.length(); ++i) { + line += ls_raw[i]; + if (ls_raw[i] == '\n') { + trim (line); + if (line.length() > 55) { + string const file = line.substr (55); + if (file != "." && file != "..") { + ls.push_back (file); + } } + line = ""; } }