//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 <iostream>
#include <string>
#include <winsock2.h>
#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 create(), l'oggetto è nuovo!
HD_STATUS_INITIALIZED, //create() è 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