|
Программирование >> Формирование пользовательского контейнера
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;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |