Scarica il sorgente database/2001-http_download_v0.01.05.h
  1. //HTTP Download Class
  2. //by mamo139
  3.  
  4. #ifndef _HTTP_DOWNLOAD_CLASS_H
  5. #define _HTTP_DOWNLOAD_CLASS_H
  6.  
  7. #define HTTP_DOWNLOAD_CLASS_VERSION "0.01"
  8.  
  9. #define DEBUG_MODE
  10.  
  11. #include <iostream>
  12. #include <string>
  13. #include <winsock2.h>
  14.  
  15. #include "matrici.h"
  16.  
  17. #pragma comment(lib,"wsock32.lib")
  18.  
  19. #define HD_HTTP_DEFAULT_PORT 80
  20. #define HD_DOWNLOAD_BUFFER_DEFAULT_SIZE 1048576
  21.  
  22. typedef enum {
  23. HD_STATUS_UNINITIALIZED, //bisogna ancora eseguire initialize(), l'oggetto è nuovo!
  24. HD_STATUS_INITIALIZED, //initialize() è stata eseguita con successo
  25. HD_STATUS_FILE_REDIRECTED, //ci siamo connessi e ricevuto codice http 302 FOUND
  26. HD_STATUS_FILE_NOT_FOUND, //ci siamo connessi e ricevuto codice http 404 NOT FOUND
  27. HD_STATUS_FILE_OK, //ci siamo connessi e ricevuto codice http 200 OK
  28. HD_STATUS_HTTP_CODE_NOT_RECOGNIZED, //ci siamo connessi e abbiamo ricevuto un codice http non previsto
  29. HD_STATUS_PROTOCOL_NOT_HTTP11, //la risposta non utilizza protocollo HTTP/1.1
  30. HD_STATUS_DOWNLOADING, //è in corso il download singolo e senza possibilità di pause and resume
  31. HD_STATUS_MULTIDOWNLOADING, //è in corso il multidownload
  32. HD_STATUS_MULTIDOWNLOADING_ASSEMBLING, //sta unendo tutti i file di download parziale
  33. HD_STATUS_MULTIDOWNLOADING_ASSEMBLING_ERROR, //errore durante l'assemblamento dei file parziali
  34. HD_STATUS_DOWNLOAD_COMPLETED, //il download è stato completato
  35. HD_STATUS_SAVED, //il download è stato salvato, serve per fare in modo che stop() non cancelli i dati
  36. HD_STATUS_STOPPED, //il download è stato stoppato
  37. HD_STATUS_PAUSED, //il download è stato messo in pausa
  38. HD_STATUS_RESUME //quando viene dato l'ordine di ricominciare il download
  39. } http_download_status;
  40.  
  41. typedef struct{ //struttura che ci serve per mandare i dati ai processi asincroni incaricati del multidownload
  42. int id_segmento; //id del segmento in cui si scarica
  43. void *oggetto; //puntatore all'istanza della classe
  44. char *file_parziale; //nome del file parziale
  45. } partial_download_data;
  46.  
  47. int hd_is_file(char *pathname); //funzione che controlla se esiste un file
  48.  
  49. class http_download {
  50.  
  51. private:
  52.  
  53. long file_size; //grandezza del file da scaricare, 0 se non impostata, -1 se non comunicata
  54. long buffer_size; //grandezza dei buffer di download
  55. int status; //a che punto si trova la classe
  56.  
  57. int multidownload; //numero di segmenti in cui dividere il download se disponibile
  58. /*matrice multidownload_points contenente i punti di partenza e posizione dei segmenti
  59. [id][0] contiene i punti partenza
  60. [id][1] contiene il punto a cui siamo
  61. [id+1][0] contiene il punto di arrivo
  62. [id][2] contiene lo status, 0 se inattivo, 1 se sta scaricando, 2 se download terminato*/
  63. matrice multidownload_points;
  64.  
  65. char url[10000]; //indirizzo completo("http://www.esempio.it/cartella/file.txt")
  66. int porta; //porta sulla quale è in ascolto il server http
  67. char host[10000]; //indirizzo server ("www.esempio.it")
  68. char host_url[10000]; //indirizzo dentro il server ("/cartella/file.txt")
  69. char file[10000]; //come salvare il file nel pc
  70.  
  71. bool is_range_accepted; //vale 1 se il server accetta il comando range, 0 altrimenti
  72. bool is_size_comunicated; //vale 1 se conosciamo la dimensione del file, 0 altrimenti
  73.  
  74. //da qui in poi variabili di comunicazione interna
  75. int luncher_ready_to_pause;
  76. int luncher_ready_to_stop;
  77. int vanilla_ready_to_stop;
  78.  
  79. public:
  80.  
  81. http_download(); //constructor
  82. ~http_download(); //destructor
  83.  
  84. /* initialize() è il primo metodo da utilizzare, serve per dire all'oggetto
  85. quale file scaricare e dove scaricaro. Inputs:
  86. _url: l'indirizzo del file (es. http://www.miosito.it/cartella/file.zip )
  87. _file: il nome con cui salvare il file scaricato
  88. _multidownload: il numero di segmenti in cui dividere il file al fine
  89. di avvelocizzarne il download, se 0 procede con un download "plain vanilla"
  90. */
  91. int initialize(char *_url, char *_file, int _multidownload);
  92.  
  93. /*settings() è un metodo che si puo eseguire dopo initialize() per modificare alcune
  94. opzioni di default. Se si inserisce il valore 0 è come confermare il valore di default.
  95. Inputs:
  96. _buffer_size: la grandezza dei buffer utilizzati nel download
  97. _porta_http: la porta dell'host su cui è in ascolto l'http server
  98. se il metodo non viene utilizzato venogno usate in automatico le opzioni di default*/
  99. int settings(long _buffer_size, int _porta_http);
  100.  
  101. /* start() avvia il download asincrono del file, seguendo le condizioni
  102. specificate dalla funzione initialize(). */
  103. int start();
  104.  
  105. /*stop() termina il download in modo irreversibile*/
  106. int stop();
  107.  
  108. /*pause() puo essere usato solo quando si è nello status HD_STATUS_MULTIDOWNLOADING
  109. return: 1 se la funzione ha successo
  110. 0 se la funzione non ha successo*/
  111. int pause();
  112.  
  113. /*resume() puo essere usato solo quando si è nello status HD_STATUS_MULTIDOWNLOADING
  114. return: 1 se la funzione ha successo
  115. 0 se la funzione non ha successo*/
  116. int resume();
  117.  
  118. /*save() puo essere usato solo quando si è nello status HD_STATUS_MULTIDOWNLOADING
  119. salva il download in modo tale che si possa riprendere in futuro.
  120. return: 1 se la funzione ha successo
  121. 0 se la funzione non ha successo*/
  122. int save();
  123.  
  124. /*load() puo essere usato solo quando si è nello status HD_STATUS_MULTIDOWNLOADING
  125. carica il salvataggio precedentemente creato con save() e cancella il salvataggio.
  126. return: 1 se la funzione ha successo
  127. 0 se la funzione non ha successo*/
  128. int load(char *_load_file);
  129.  
  130. /*non ancora implementata*/
  131. int backup(char *_save_file);
  132.  
  133. /*get_status() resituisce lo status dell'oggetto, molto utile per monitorare la situazione,
  134. soprattutto nelle fasi asincrone*/
  135. int get_status();
  136.  
  137. /*print() visualizza tutti i dati*/
  138. int print();
  139.  
  140. /*funzioni utilizzate internamente dai metodi, non utilizzare!!!*/
  141. friend int hd_connessione_header(http_download *download);
  142. friend int hd_connessione_header_partial_content(http_download *download);
  143. friend int hd_connessione_download_vanilla(http_download *download);
  144. friend int hd_connessione_multidownload_segmento(partial_download_data *dati);
  145.  
  146. friend int hd_multidownload_luncher(http_download *download);
  147. friend int hd_multidownload_files_assembler(http_download *download, partial_download_data *dati);
  148.  
  149.  
  150. };
  151.  
  152. #endif