//_______________________________________________________________________
// Main.cpp

#include "setup.h"
#include "curl.h"
#include "NoCurl.h"

CURL  *TabCurl[NBFILES];
CURLM *Multi;
FILE  *Door[NBFILES];
char  *CurUrl[NBFILES], UrlName[NBFILES][1024];
//_______________________________________________________________________
size_t CallBaPR ( void *Ptr, size_t Size, size_t NMemb, void *Stream )
  {
  int Idx;
  for ( Idx=1; Idx>=0; Idx-- )
    if ( Door[Idx] == (FILE*) Stream )   break;
  fwrite ( Ptr, Size, NMemb, (FILE*) Stream );
  return NMemb;
  }
//_______________________________________________________________________
void CurlInit ( CURL* &Curl, int Idx )
  {
  Curl = curl_easy_init ();
  curl_easy_setopt ( Curl, CURLOPT_SSL_VERIFYPEER, 0 );
  curl_easy_setopt ( Curl, CURLOPT_SSL_VERIFYHOST, 1 );
  curl_easy_setopt ( Curl, CURLOPT_WRITEFUNCTION, CallBaPR );
  curl_easy_setopt ( Curl, CURLOPT_WRITEDATA, Door[Idx] );
  curl_easy_setopt ( Curl, CURLOPT_VERBOSE, 1 );
  }
//_______________________________________________________________________
int main ()
  {
  CURL    *Fini;
  CURLMsg *Msg;
  fd_set  FRead, FWrite, FErr;
  struct  timeval Tim;
  int     Idx, Running = 1, MaxFd, Query, MaxLon;
  long    Attend;

  for ( Idx=1; Idx>=0; Idx-- )
    Ouvre ( Idx );                          // open Temp000 and Temp001

  OriginalUrl ( CurUrl[0] );
  CurUrl[1] = UrlName[1];
  curl_global_init ( CURL_GLOBAL_ALL );
  Multi = curl_multi_init ();
  curl_multi_setopt ( Multi, CURLMOPT_MAXCONNECTS, NBFILES );
  CurlInit ( TabCurl[0], 0 );
  curl_easy_setopt ( TabCurl[0], CURLOPT_URL, CurUrl[0] );
  curl_easy_perform ( TabCurl[0] );         // 1 unique page
  curl_easy_cleanup ( TabCurl[0] );
  VeriSign ( MaxLon );                      // creates URL0 and URL1

  for ( Idx=1; Idx>=0; Idx-- )
    {
    sprintf ( CurUrl[Idx] + MaxLon, "%1d", 1 + Idx );
    CurlInit ( TabCurl[Idx], Idx );
    curl_easy_setopt ( TabCurl[Idx], CURLOPT_URL, CurUrl[Idx] );
    curl_multi_add_handle ( Multi, TabCurl[Idx] );
    }

  while ( Running )                         // 2 pages together
    {
    while ( curl_multi_perform ( Multi, &Running )
            == CURLM_CALL_MULTI_PERFORM );

    if ( Running )
      {
      FD_ZERO ( &FRead );
      FD_ZERO ( &FWrite );
      FD_ZERO ( &FErr );
      curl_multi_fdset   ( Multi, &FRead, &FWrite, &FErr, &MaxFd );
      curl_multi_timeout ( Multi, &Attend );
      if ( Attend == -1 )   Attend = 100;

      if ( MaxFd == -1 )   Sleep ( Attend );
      else
        {
        Tim.tv_sec = Attend / 1000;
        Tim.tv_usec = ( Attend % 1000 ) * 1000;
        select ( MaxFd + 1, &FRead, &FWrite, &FErr, &Tim );
        }
      }

    while ( Msg = curl_multi_info_read ( Multi, &Query ) )
      {
      Fini = Msg->easy_handle;
      for ( Idx=1; Idx>=0; Idx-- )
        if ( TabCurl[Idx] == Fini )   break;

      Extrait ( Idx );                      // extracts information
      curl_multi_remove_handle ( Multi, TabCurl[Idx] );
      curl_easy_cleanup ( TabCurl[Idx] );
      }
    }

  curl_multi_cleanup ( Multi );
  curl_global_cleanup ();

  for ( Idx=1; Idx>=0; Idx-- )
    Ferme ( Idx );                          // close Temp000 and Temp001
  return 0;
  }
//_______________________________________________________________________
