//HTTP Download Class //by mamo139 #ifndef _HTTP_DOWNLOAD_CLASS_H #define _HTTP_DOWNLOAD_CLASS_H #define HTTP_DOWNLOAD_CLASS_VERSION "0.01" #define DEBUG_MODE #include #include #include #include "matrici.h" #pragma comment(lib,"wsock32.lib") #define HD_HTTP_DEFAULT_PORT 80 #define HD_DOWNLOAD_BUFFER_DEFAULT_SIZE 1048576 typedef enum { HD_STATUS_UNINITIALIZED, //bisogna ancora eseguire initialize(), l'oggetto è nuovo! HD_STATUS_INITIALIZED, //initialize() è stata eseguita con successo HD_STATUS_FILE_REDIRECTED, //ci siamo connessi e ricevuto codice http 302 FOUND HD_STATUS_FILE_NOT_FOUND, //ci siamo connessi e ricevuto codice http 404 NOT FOUND HD_STATUS_FILE_OK, //ci siamo connessi e ricevuto codice http 200 OK HD_STATUS_HTTP_CODE_NOT_RECOGNIZED, //ci siamo connessi e abbiamo ricevuto un codice http non previsto HD_STATUS_PROTOCOL_NOT_HTTP11, //la risposta non utilizza protocollo HTTP/1.1 HD_STATUS_DOWNLOADING, //è in corso il download singolo e senza possibilità di pause and resume HD_STATUS_MULTIDOWNLOADING, //è in corso il multidownload HD_STATUS_MULTIDOWNLOADING_ASSEMBLING, //sta unendo tutti i file di download parziale HD_STATUS_MULTIDOWNLOADING_ASSEMBLING_ERROR, //errore durante l'assemblamento dei file parziali HD_STATUS_DOWNLOAD_COMPLETED, //il download è stato completato HD_STATUS_SAVED, //il download è stato salvato, serve per fare in modo che stop() non cancelli i dati HD_STATUS_STOPPED, //il download è stato stoppato HD_STATUS_PAUSED, //il download è stato messo in pausa HD_STATUS_RESUME //quando viene dato l'ordine di ricominciare il download } http_download_status; typedef struct{ //struttura che ci serve per mandare i dati ai processi asincroni incaricati del multidownload int id_segmento; //id del segmento in cui si scarica void *oggetto; //puntatore all'istanza della classe char *file_parziale; //nome del file parziale } partial_download_data; int hd_is_file(char *pathname); //funzione che controlla se esiste un file class http_download { private: long file_size; //grandezza del file da scaricare, 0 se non impostata, -1 se non comunicata long buffer_size; //grandezza dei buffer di download int status; //a che punto si trova la classe int multidownload; //numero di segmenti in cui dividere il download se disponibile /*matrice multidownload_points contenente i punti di partenza e posizione dei segmenti [id][0] contiene i punti partenza [id][1] contiene il punto a cui siamo [id+1][0] contiene il punto di arrivo [id][2] contiene lo status, 0 se inattivo, 1 se sta scaricando, 2 se download terminato*/ matrice multidownload_points; char url[10000]; //indirizzo completo("http://www.esempio.it/cartella/file.txt") int porta; //porta sulla quale è in ascolto il server http char host[10000]; //indirizzo server ("www.esempio.it") char host_url[10000]; //indirizzo dentro il server ("/cartella/file.txt") char file[10000]; //come salvare il file nel pc bool is_range_accepted; //vale 1 se il server accetta il comando range, 0 altrimenti bool is_size_comunicated; //vale 1 se conosciamo la dimensione del file, 0 altrimenti //da qui in poi variabili di comunicazione interna int luncher_ready_to_pause; int luncher_ready_to_stop; int vanilla_ready_to_stop; public: http_download(); //constructor ~http_download(); //destructor /* initialize() è il primo metodo da utilizzare, serve per dire all'oggetto quale file scaricare e dove scaricaro. Inputs: _url: l'indirizzo del file (es. http://www.miosito.it/cartella/file.zip ) _file: il nome con cui salvare il file scaricato _multidownload: il numero di segmenti in cui dividere il file al fine di avvelocizzarne il download, se 0 procede con un download "plain vanilla" */ int initialize(char *_url, char *_file, int _multidownload); /*settings() è un metodo che si puo eseguire dopo initialize() per modificare alcune opzioni di default. Se si inserisce il valore 0 è come confermare il valore di default. Inputs: _buffer_size: la grandezza dei buffer utilizzati nel download _porta_http: la porta dell'host su cui è in ascolto l'http server se il metodo non viene utilizzato venogno usate in automatico le opzioni di default*/ int settings(long _buffer_size, int _porta_http); /* start() avvia il download asincrono del file, seguendo le condizioni specificate dalla funzione initialize(). */ int start(); /*stop() termina il download in modo irreversibile*/ int stop(); /*pause() puo essere usato solo quando si è nello status HD_STATUS_MULTIDOWNLOADING return: 1 se la funzione ha successo 0 se la funzione non ha successo*/ int pause(); /*resume() puo essere usato solo quando si è nello status HD_STATUS_MULTIDOWNLOADING return: 1 se la funzione ha successo 0 se la funzione non ha successo*/ int resume(); /*save() puo essere usato solo quando si è nello status HD_STATUS_MULTIDOWNLOADING salva il download in modo tale che si possa riprendere in futuro. return: 1 se la funzione ha successo 0 se la funzione non ha successo*/ int save(); /*load() puo essere usato solo quando si è nello status HD_STATUS_MULTIDOWNLOADING carica il salvataggio precedentemente creato con save() e cancella il salvataggio. return: 1 se la funzione ha successo 0 se la funzione non ha successo*/ int load(char *_load_file); /*non ancora implementata*/ int backup(char *_save_file); /*get_status() resituisce lo status dell'oggetto, molto utile per monitorare la situazione, soprattutto nelle fasi asincrone*/ int get_status(); /*print() visualizza tutti i dati*/ int print(); /*funzioni utilizzate internamente dai metodi, non utilizzare!!!*/ friend int hd_connessione_header(http_download *download); friend int hd_connessione_header_partial_content(http_download *download); friend int hd_connessione_download_vanilla(http_download *download); friend int hd_connessione_multidownload_segmento(partial_download_data *dati); friend int hd_multidownload_luncher(http_download *download); friend int hd_multidownload_files_assembler(http_download *download, partial_download_data *dati); }; #endif