// test.cpp : Defines the entry point for the console application.
//

#include "curl/curl.h"

#ifdef _DEBUG
# pragma comment(lib, "libcurld.lib")
#else
# pragma comment(lib, "libcurl.lib")
#endif


#define URL "ftp://ftp.rge.com/pub/networking/curl/curl-7.9.8.zip"

struct ReadingData {
  long _lNbToRead;
  long _lNbRead;
};

size_t _ISReceiveFromCurl(void* ptr, size_t size, size_t nmemb, void* data)
{
  ReadingData readingData = *(ReadingData*)data;
  int realsize = size * nmemb;
  printf("Read %i bytes from the file\n", realsize);
  readingData._lNbRead += realsize;
  if (readingData._lNbRead > readingData._lNbToRead) {
    printf("Ok : We have read %i > %i bytes\n", readingData._lNbRead, readingData._lNbToRead);
    return -1;
  }
  return realsize;
}

int main(int argc, char* argv[])
{
  curl_global_init(CURL_GLOBAL_ALL);
  CURL* pCurlHandle = curl_easy_init();
  CURLcode err = curl_easy_setopt(pCurlHandle, CURLOPT_URL, URL);
  err = curl_easy_setopt(pCurlHandle, CURLOPT_READFUNCTION, NULL);
  err = curl_easy_setopt(pCurlHandle, CURLOPT_WRITEFUNCTION, _ISReceiveFromCurl);
  curl_easy_setopt(pCurlHandle, CURLOPT_UPLOAD, false) ;
  ReadingData readingData;
  // First Read : 10000 bytes
  readingData._lNbToRead = 10000;
  readingData._lNbRead = 0;
  printf("First Read : %i bytes\n", readingData._lNbToRead);
  err = curl_easy_setopt(pCurlHandle, CURLOPT_FILE, (void *)&readingData);
  err = curl_easy_perform(pCurlHandle);
  printf("easy_perform result : %i\n", err);

  // Second Read : 10000 bytes
  readingData._lNbToRead = 10000;
  readingData._lNbRead = 0;
  printf("Second Read : %i bytes\n", readingData._lNbToRead);
  err = curl_easy_perform(pCurlHandle);
  printf("easy_perform result : %i\n", err);

  // Third Read : all : 1000000000 bytes
  readingData._lNbToRead = 1000000000;
  readingData._lNbRead = 0;
  printf("Last Read : all bytes\n");
  err = curl_easy_perform(pCurlHandle);
  printf("easy_perform result : %i\n", err);

  return 0;
}


