summaryrefslogtreecommitdiffstats
path: root/examples/mailtransportresource/mailtransport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/mailtransportresource/mailtransport.cpp')
-rw-r--r--examples/mailtransportresource/mailtransport.cpp63
1 files changed, 38 insertions, 25 deletions
diff --git a/examples/mailtransportresource/mailtransport.cpp b/examples/mailtransportresource/mailtransport.cpp
index 65299a2..361a89e 100644
--- a/examples/mailtransportresource/mailtransport.cpp
+++ b/examples/mailtransportresource/mailtransport.cpp
@@ -20,7 +20,9 @@
20 20
21#include <QByteArray> 21#include <QByteArray>
22#include <QList> 22#include <QList>
23#include <QDebug> 23#include <QLoggingCategory>
24
25Q_LOGGING_CATEGORY(mailtransportCategory, "mailtransport")
24 26
25extern "C" { 27extern "C" {
26 28
@@ -48,7 +50,6 @@ static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp)
48 if (len > size * nmemb) { 50 if (len > size * nmemb) {
49 len = size * nmemb; 51 len = size * nmemb;
50 } 52 }
51 fprintf(stdout, "read n bytes: %d\n", int(len));
52 memcpy(ptr, data, len); 53 memcpy(ptr, data, len);
53 upload_ctx->offset += len; 54 upload_ctx->offset += len;
54 return len; 55 return len;
@@ -57,26 +58,17 @@ static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp)
57 return 0; 58 return 0;
58} 59}
59 60
60static int progress_callback(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) 61bool sendMessageCurl(const char *to[], int numTos,
61{ 62 const char *cc[], int numCcs,
62 if (ultotal > 0) { 63 const char *msg,
63 auto progress = ulnow * 100.0/ ultotal; 64 bool useTls,
64 fprintf(stdout, "Upload progress: %d \n", int(progress)); 65 const char* from,
65 } 66 const char *username, const char *password,
66 return 0; 67 const char *server, bool verifyPeer, const QByteArray &cacert, QByteArray &errorMessage,
67} 68 bool enableDebugOutput,
68 69 int (*debug_callback)(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr),
69static int debug_callback(CURL *handle, 70 int (*progress_callback)(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow)
70 curl_infotype type, 71 )
71 char *data,
72 size_t size,
73 void *userptr)
74{
75 fprintf(stdout, "CURL_DEBUG: %s", data);
76 return 0;
77}
78
79bool sendMessageCurl(const char *to[], int numTos, const char *cc[], int numCcs, const char *msg, bool useTls, const char* from, const char *username, const char *password, const char *server, bool verifyPeer, const QByteArray &cacert, QByteArray &errorMessage)
80{ 72{
81 CURL *curl; 73 CURL *curl;
82 CURLcode res = CURLE_OK; 74 CURLcode res = CURLE_OK;
@@ -127,10 +119,11 @@ bool sendMessageCurl(const char *to[], int numTos, const char *cc[], int numCcs,
127 /* Since the traffic will be encrypted, it is very useful to turn on debug 119 /* Since the traffic will be encrypted, it is very useful to turn on debug
128 * information within libcurl to see what is happening during the transfer. 120 * information within libcurl to see what is happening during the transfer.
129 */ 121 */
130 // curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); 122 if (enableDebugOutput) {
123 curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
124 }
131 curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, debug_callback); 125 curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, debug_callback);
132 126
133 // curl_easy_setopt(curl, CURLOPT_TIMEOUT, 1L);
134 //Connection timeout of 40s 127 //Connection timeout of 40s
135 curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 40L); 128 curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 40L);
136 129
@@ -190,7 +183,27 @@ MailTransport::SendResult MailTransport::sendMessage(const KMime::Message::Ptr &
190 auto serverAddress = server; 183 auto serverAddress = server;
191 serverAddress.replace("smtps://", "smtp://"); 184 serverAddress.replace("smtps://", "smtp://");
192 185
186 bool enableDebugOutput = QLoggingCategory{"mailtransport"}.isEnabled(QtDebugMsg);
193 QByteArray errorMessage; 187 QByteArray errorMessage;
194 auto ret = sendMessageCurl(to, numTos, cc, numCcs, message->encodedContent(), useTls, from.isEmpty() ? nullptr : from, username, password, serverAddress, verifyPeer, cacert, errorMessage); 188 auto ret = sendMessageCurl(to, numTos, cc, numCcs,
189 message->encodedContent(),
190 useTls,
191 from.isEmpty() ? nullptr : from,
192 username, password,
193 serverAddress, verifyPeer, cacert,
194 errorMessage,
195 enableDebugOutput,
196 [] (CURL *handle, curl_infotype type, char *data, size_t size, void *) -> int {
197 //FIXME all a callback passed to sendMessage using the provided user pointer,
198 //because lambdas with captures cannot be converted to function pointers.
199 qCDebug(mailtransportCategory) << QString::fromUtf8(data, size);
200 return 0;
201 },
202 [] (void *, curl_off_t, curl_off_t, curl_off_t ultotal, curl_off_t ulnow) -> int {
203 if (ultotal > 0) {
204 qCDebug(mailtransportCategory) << "Upload progress " << ulnow << " out of " << ultotal;
205 }
206 return 0;
207 });
195 return {ret, errorMessage}; 208 return {ret, errorMessage};
196} 209}