diff options
Diffstat (limited to 'src/mgr/curlftpt.cpp')
-rw-r--r-- | src/mgr/curlftpt.cpp | 150 |
1 files changed, 78 insertions, 72 deletions
diff --git a/src/mgr/curlftpt.cpp b/src/mgr/curlftpt.cpp index 7d2fd3c..63eacb1 100644 --- a/src/mgr/curlftpt.cpp +++ b/src/mgr/curlftpt.cpp @@ -1,9 +1,10 @@ - /***************************************************************************** - * CURLFTPTransport functions +/***************************************************************************** * + * curlftpt.cpp - CURLFTPTransport * + * $Id: curlftpt.cpp 2980 2013-09-14 21:51:47Z scribe $ * - * Copyright 2009 CrossWire Bible Society (http://www.crosswire.org) + * Copyright 2004-2013 CrossWire Bible Society (http://www.crosswire.org) * CrossWire Bible Society * P. O. Box 2528 * Tempe, AZ 85280-2528 @@ -19,106 +20,110 @@ * */ - - #include <curlftpt.h> #include <fcntl.h> #include <curl/curl.h> -#include <curl/types.h> #include <curl/easy.h> #include <swlog.h> -SWORD_NAMESPACE_START +SWORD_NAMESPACE_START -struct FtpFile { - const char *filename; - FILE *stream; - SWBuf *destBuf; -}; +namespace { + struct FtpFile { + const char *filename; + FILE *stream; + SWBuf *destBuf; + }; -int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream); -int my_fprogress(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow); -static CURLFTPTransport_init _CURLFTPTransport_init; + // initialize/cleanup SYSTEMWIDE library with life of this static. + static class CURLFTPTransport_init { + public: + CURLFTPTransport_init() { + curl_global_init(CURL_GLOBAL_DEFAULT); // curl_easy_init automatically calls it if needed + } -CURLFTPTransport_init::CURLFTPTransport_init() { - curl_global_init(CURL_GLOBAL_DEFAULT); // curl_easy_init automatically calls it if needed -} + ~CURLFTPTransport_init() { + curl_global_cleanup(); + } + } _curlFTPTransport_init; -CURLFTPTransport_init::~CURLFTPTransport_init() { - curl_global_cleanup(); -} -int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream) { - struct FtpFile *out=(struct FtpFile *)stream; - if (out && !out->stream && !out->destBuf) { - /* open file for writing */ - out->stream=fopen(out->filename, "wb"); - if (!out->stream) - return -1; /* failure, can't open file to write */ - } - if (out->destBuf) { - int s = out->destBuf->size(); - out->destBuf->size(s+(size*nmemb)); - memcpy(out->destBuf->getRawData()+s, buffer, size*nmemb); - return nmemb; + static int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream) { + struct FtpFile *out=(struct FtpFile *)stream; + if (out && !out->stream && !out->destBuf) { + /* open file for writing */ + out->stream=fopen(out->filename, "wb"); + if (!out->stream) + return -1; /* failure, can't open file to write */ + } + if (out->destBuf) { + int s = out->destBuf->size(); + out->destBuf->size(s+(size*nmemb)); + memcpy(out->destBuf->getRawData()+s, buffer, size*nmemb); + return nmemb; + } + return fwrite(buffer, size, nmemb, out->stream); } - return fwrite(buffer, size, nmemb, out->stream); -} -struct MyProgressData { - StatusReporter *sr; - bool *term; -}; + struct MyProgressData { + StatusReporter *sr; + bool *term; + }; -int my_fprogress(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow) { - if (clientp) { - MyProgressData *pd = (MyProgressData *)clientp; -SWLog::getSystemLog()->logDebug("CURLFTPTransport report progress: totalSize: %ld; xfered: %ld\n", (long)dltotal, (long)dlnow); - if (pd->sr) { - pd->sr->statusUpdate(dltotal, dlnow); + static int my_fprogress(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow) { + if (clientp) { + MyProgressData *pd = (MyProgressData *)clientp; + SWLog::getSystemLog()->logDebug("CURLFTPTransport report progress: totalSize: %ld; xfered: %ld\n", (long)dltotal, (long)dlnow); + if (pd->sr) { + if (dltotal < 0) dltotal = 0; + if (dlnow < 0) dlnow = 0; + if (dlnow > dltotal) dlnow = dltotal; + pd->sr->update(dltotal, dlnow); + } + if (*(pd->term)) return 1; } - if (*(pd->term)) return 1; + return 0; } - return 0; -} -static int my_trace(CURL *handle, curl_infotype type, unsigned char *data, size_t size, void *userp) { - SWBuf header; - (void)userp; /* prevent compiler warning */ - (void)handle; /* prevent compiler warning */ + static int my_trace(CURL *handle, curl_infotype type, unsigned char *data, size_t size, void *userp) { + SWBuf header; + (void)userp; /* prevent compiler warning */ + (void)handle; /* prevent compiler warning */ - switch (type) { - case CURLINFO_TEXT: header = "TEXT"; break; - case CURLINFO_HEADER_OUT: header = "=> Send header"; break; - case CURLINFO_HEADER_IN: header = "<= Recv header"; break; - - // these we don't want to log (HUGE) - case CURLINFO_DATA_OUT: header = "=> Send data"; - case CURLINFO_SSL_DATA_OUT: header = "=> Send SSL data"; - case CURLINFO_DATA_IN: header = "<= Recv data"; - case CURLINFO_SSL_DATA_IN: header = "<= Recv SSL data"; - default: /* in case a new one is introduced to shock us */ + switch (type) { + case CURLINFO_TEXT: header = "TEXT"; break; + case CURLINFO_HEADER_OUT: header = "=> Send header"; break; + case CURLINFO_HEADER_IN: header = "<= Recv header"; break; + + // these we don't want to log (HUGE) + case CURLINFO_DATA_OUT: header = "=> Send data"; + case CURLINFO_SSL_DATA_OUT: header = "=> Send SSL data"; + case CURLINFO_DATA_IN: header = "<= Recv data"; + case CURLINFO_SSL_DATA_IN: header = "<= Recv SSL data"; + default: /* in case a new one is introduced to shock us */ + return 0; + } + + if (size > 120) size = 120; + SWBuf text; + text.size(size); + memcpy(text.getRawData(), data, size); + SWLog::getSystemLog()->logDebug("CURLFTPTransport: %s: %s", header.c_str(), text.c_str()); return 0; } - - if (size > 120) size = 120; - SWBuf text; - text.size(size); - memcpy(text.getRawData(), data, size); - SWLog::getSystemLog()->logDebug("CURLFTPTransport: %s: %s", header.c_str(), text.c_str()); - return 0; } -CURLFTPTransport::CURLFTPTransport(const char *host, StatusReporter *sr) : FTPTransport(host, sr) { + +CURLFTPTransport::CURLFTPTransport(const char *host, StatusReporter *sr) : RemoteTransport(host, sr) { session = (CURL *)curl_easy_init(); } @@ -156,6 +161,7 @@ char CURLFTPTransport::getURL(const char *destPath, const char *sourceURL, SWBuf /* Switch on full protocol/debug output */ curl_easy_setopt(session, CURLOPT_VERBOSE, true); + curl_easy_setopt(session, CURLOPT_CONNECTTIMEOUT, 45); /* FTP connection settings */ |