Annotation of embedaddon/curl/docs/examples/progressfunc.c, revision 1.1.1.1

1.1       misho       1: /***************************************************************************
                      2:  *                                  _   _ ____  _
                      3:  *  Project                     ___| | | |  _ \| |
                      4:  *                             / __| | | | |_) | |
                      5:  *                            | (__| |_| |  _ <| |___
                      6:  *                             \___|\___/|_| \_\_____|
                      7:  *
                      8:  * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
                      9:  *
                     10:  * This software is licensed as described in the file COPYING, which
                     11:  * you should have received as part of this distribution. The terms
                     12:  * are also available at https://curl.haxx.se/docs/copyright.html.
                     13:  *
                     14:  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
                     15:  * copies of the Software, and permit persons to whom the Software is
                     16:  * furnished to do so, under the terms of the COPYING file.
                     17:  *
                     18:  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
                     19:  * KIND, either express or implied.
                     20:  *
                     21:  ***************************************************************************/
                     22: /* <DESC>
                     23:  * Use the progress callbacks, old and/or new one depending on available
                     24:  * libcurl version.
                     25:  * </DESC>
                     26:  */
                     27: #include <stdio.h>
                     28: #include <curl/curl.h>
                     29: 
                     30: #if LIBCURL_VERSION_NUM >= 0x073d00
                     31: /* In libcurl 7.61.0, support was added for extracting the time in plain
                     32:    microseconds. Older libcurl versions are stuck in using 'double' for this
                     33:    information so we complicate this example a bit by supporting either
                     34:    approach. */
                     35: #define TIME_IN_US 1 /* microseconds */
                     36: #define TIMETYPE curl_off_t
                     37: #define TIMEOPT CURLINFO_TOTAL_TIME_T
                     38: #define MINIMAL_PROGRESS_FUNCTIONALITY_INTERVAL     3000000
                     39: #else
                     40: #define TIMETYPE double
                     41: #define TIMEOPT CURLINFO_TOTAL_TIME
                     42: #define MINIMAL_PROGRESS_FUNCTIONALITY_INTERVAL     3
                     43: #endif
                     44: 
                     45: #define STOP_DOWNLOAD_AFTER_THIS_MANY_BYTES         6000
                     46: 
                     47: struct myprogress {
                     48:   TIMETYPE lastruntime; /* type depends on version, see above */
                     49:   CURL *curl;
                     50: };
                     51: 
                     52: /* this is how the CURLOPT_XFERINFOFUNCTION callback works */
                     53: static int xferinfo(void *p,
                     54:                     curl_off_t dltotal, curl_off_t dlnow,
                     55:                     curl_off_t ultotal, curl_off_t ulnow)
                     56: {
                     57:   struct myprogress *myp = (struct myprogress *)p;
                     58:   CURL *curl = myp->curl;
                     59:   TIMETYPE curtime = 0;
                     60: 
                     61:   curl_easy_getinfo(curl, TIMEOPT, &curtime);
                     62: 
                     63:   /* under certain circumstances it may be desirable for certain functionality
                     64:      to only run every N seconds, in order to do this the transaction time can
                     65:      be used */
                     66:   if((curtime - myp->lastruntime) >= MINIMAL_PROGRESS_FUNCTIONALITY_INTERVAL) {
                     67:     myp->lastruntime = curtime;
                     68: #ifdef TIME_IN_US
                     69:     fprintf(stderr, "TOTAL TIME: %" CURL_FORMAT_CURL_OFF_T ".%06ld\r\n",
                     70:             (curtime / 1000000), (long)(curtime % 1000000));
                     71: #else
                     72:     fprintf(stderr, "TOTAL TIME: %f \r\n", curtime);
                     73: #endif
                     74:   }
                     75: 
                     76:   fprintf(stderr, "UP: %" CURL_FORMAT_CURL_OFF_T " of %" CURL_FORMAT_CURL_OFF_T
                     77:           "  DOWN: %" CURL_FORMAT_CURL_OFF_T " of %" CURL_FORMAT_CURL_OFF_T
                     78:           "\r\n",
                     79:           ulnow, ultotal, dlnow, dltotal);
                     80: 
                     81:   if(dlnow > STOP_DOWNLOAD_AFTER_THIS_MANY_BYTES)
                     82:     return 1;
                     83:   return 0;
                     84: }
                     85: 
                     86: #if LIBCURL_VERSION_NUM < 0x072000
                     87: /* for libcurl older than 7.32.0 (CURLOPT_PROGRESSFUNCTION) */
                     88: static int older_progress(void *p,
                     89:                           double dltotal, double dlnow,
                     90:                           double ultotal, double ulnow)
                     91: {
                     92:   return xferinfo(p,
                     93:                   (curl_off_t)dltotal,
                     94:                   (curl_off_t)dlnow,
                     95:                   (curl_off_t)ultotal,
                     96:                   (curl_off_t)ulnow);
                     97: }
                     98: #endif
                     99: 
                    100: int main(void)
                    101: {
                    102:   CURL *curl;
                    103:   CURLcode res = CURLE_OK;
                    104:   struct myprogress prog;
                    105: 
                    106:   curl = curl_easy_init();
                    107:   if(curl) {
                    108:     prog.lastruntime = 0;
                    109:     prog.curl = curl;
                    110: 
                    111:     curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
                    112: 
                    113: #if LIBCURL_VERSION_NUM >= 0x072000
                    114:     /* xferinfo was introduced in 7.32.0, no earlier libcurl versions will
                    115:        compile as they won't have the symbols around.
                    116: 
                    117:        If built with a newer libcurl, but running with an older libcurl:
                    118:        curl_easy_setopt() will fail in run-time trying to set the new
                    119:        callback, making the older callback get used.
                    120: 
                    121:        New libcurls will prefer the new callback and instead use that one even
                    122:        if both callbacks are set. */
                    123: 
                    124:     curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, xferinfo);
                    125:     /* pass the struct pointer into the xferinfo function, note that this is
                    126:        an alias to CURLOPT_PROGRESSDATA */
                    127:     curl_easy_setopt(curl, CURLOPT_XFERINFODATA, &prog);
                    128: #else
                    129:     curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, older_progress);
                    130:     /* pass the struct pointer into the progress function */
                    131:     curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, &prog);
                    132: #endif
                    133: 
                    134:     curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
                    135:     res = curl_easy_perform(curl);
                    136: 
                    137:     if(res != CURLE_OK)
                    138:       fprintf(stderr, "%s\n", curl_easy_strerror(res));
                    139: 
                    140:     /* always cleanup */
                    141:     curl_easy_cleanup(curl);
                    142:   }
                    143:   return (int)res;
                    144: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>