X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Finternet.cc;h=67f6ed2bc8a71dc42f7e9975fd6fe0102963f0fc;hb=a34e100c7e8f7bce98cf074ecb0507fe6175df61;hp=7bc818717a44737f2719960a8bc8832aff4eec82;hpb=e60bb3e51bd1508b149e6b8f6608f09b5196ae26;p=dcpomatic.git diff --git a/src/lib/internet.cc b/src/lib/internet.cc index 7bc818717..67f6ed2bc 100644 --- a/src/lib/internet.cc +++ b/src/lib/internet.cc @@ -1,32 +1,34 @@ /* 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 "cross.h" +#include +#include #include #include #include #include -#include -#include -#include "scoped_temporary.h" -#include "compose.hpp" -#include "safe_stringstream.h" +#include #include "i18n.h" @@ -48,7 +50,7 @@ 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 (); @@ -59,6 +61,11 @@ get_from_zip_url (string url, string file, function (_("Could not open downloaded ZIP file")); + } + + zip_source_t* zip_source = zip_source_filep_create (zip_file, 0, -1, 0); + if (!zip_source) { + return optional (_("Could not open downloaded ZIP file")); + } + + zip_t* zip = zip_open_from_source (zip_source, 0, 0); if (!zip) { return optional (_("Could not open downloaded ZIP file")); } - struct zip_file* zip_file = zip_fopen (zip, file.c_str(), 0); - if (!zip_file) { +#else + struct zip* zip = zip_open (temp_zip.c_str(), 0, 0); +#endif + + struct zip_file* file_in_zip = zip_fopen (zip, file.c_str(), 0); + if (!file_in_zip) { return optional (_("Unexpected ZIP file contents")); } @@ -86,19 +113,20 @@ 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) { @@ -107,15 +135,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) != "/") { @@ -132,21 +160,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 line = s.getline (); - trim (line); - 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 = ""; } }