Программирование >>  Формирование пользовательского контейнера 

1 ... 62 63 64 [ 65 ] 66 67 68 ... 156


unsigned long contentlen; длина контента unsigned long len; длина contentlen

unsigned long total =0; накапливаемый итог полученных байтов char header[80]; содержит заголовок Range

try {

if {!ishttp{iarl))

throw DLExc( Must be HTTP url. );

Открывает файл, заданный в url.

Открытый поток будет возвращаться

в fout. Если reload равна true, даннйе

в любом загружавшемся прежде файле будут удалены.

Возвращается длина любого загружавшегося ранее файла

(после возможного удаления данных).

filelen = openfile(url, reload, fout);

Проверяет, доступно ли интернет-соединение, if (IntemetAtteitptConnect(O) != ERRORSUCCESS) throw DLExc( Cant connect. );

Открывает интернет-соединение. hinet = Intemetppen( downloader ,

INTERNET OPEN TYPE DIRECT,

NULL, NULL, 0);

if(hInet == NULL)

throw DLExc( Cant open connection. );

Конструирует заголовок запрашиваемого интервала данных, sprintf(header, Range:bytes=%d- , filelen);

Открывает URL и запрашивает диапазон. hlurl = Internetopenurl(hInet, url, header, -1,

INTERNET FLAG NO CACHE WRITE, 0); if(hlurl == NULL) throw DLExc( Cant open url. );



II Подтверзкдает, что поддерживается протокол HTTP/1.1 или более поздние его версии, if(ihttpverOK(hlurl))

throw DLExc( HTTP/1.1 not supported. );

Получает длину контента, len = sizeof contentlen; if(!HttpQuerylnfо(hlurl,

HTTP QUERY CONTENT J.ENGTH

HTTP QUERY FLAG NUMBER,

bcontentlen, &len, NULL)) throw DLExc( File or content length not found. );

Если существующий файл (при условии, что он есть) не завершен, завершает его загрузку, if(filelen != contentlen && contentlen) do {

Читает буфер pf info.

if {! IntemetReadFile (hlurl, &buf,

BUF SIZE, &nlлnrcved)) throw DLExc( Error occurred during download. );

Записьшает буфер на диск.

fout.write{(const char *) buf, nlлnrcved);

if (ifout.goodO)

throw DLExc( Error writing file. );

total += nlлnrcved; обновляет накапливаемый итог

Вызывает функцию update, если она задана, if(update && numrcved > 0)

update(contentlen+filelen, total+filelen);

} while(numrcved > 0); else

if(update)

update(filelen, filelen);

} catch(DLExc) {



fout.close();

InternetCloseHandle(hlurl); InternetCloseHandle(hInet);

throw; повторно генерирует исключение для использования вызыва1сщей программой (caller)

fout.close();

InternetCloseHandle(hlurl); InternetCloseHandle (hInet);

return true;

Возвращает true, если у протокола HTTP версия 1.1 или более поздняя, bool Download: :httpverOK(HINTE3ET hlurl) {

char str[80];

imsigned long len = 79;

Получает версию протокола HTTP.

if(!HttpQueryinfо(hlurl, HTTP QUERY VERSION, &str, &len, NULL)) return false;

Сначала проверяет главный номер версии HTTP.

char *р = strchr(str, /);

Р++;

if(*p == О) return false; can use HTTP 0.x

Теперь находит начало младшего номера версии HTTP.

Р = strchr(str, .);

Р++;

Преобразует в тип int. int minorVerNum = atoi (p);

if (minorVerNum > 0) return true; return false;



1 ... 62 63 64 [ 65 ] 66 67 68 ... 156

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика