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

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


II Выделяет имя файла из URL. Возврашает false, если

имя файла не может быть найдено,

bool Download::getfname(char *url, char *fname) {

Находит последний слэш (/).

char *p = strrchr{url, /);

Копирует имя файла после последнего знака /. if(р && {strlen{p) < MAX FILENAME SIZE)) { Р++;

strcpy(fname, p); return true,

else

return false;

Открывает файл вывода, инициализирует поток

вывода и возвращает длину файла. Если

reload равна true, сначала укорачивает до нуля любой

уже существующий файл.

unsigned long Download::openfile(char *url,

bool reload, ofstream &fout) {

char fname[MAX FILENAME SIZE]; i f(!getfname{url, fname))

throw DLExc( File name error. );

if{!reload)

fout.open{fname, ios::binary ios::out ios::app ios::ate);

else

fout.open{fname, ios::binary ios::out ios::trunc);

if{!fout)

throw DLExc{ Cant open output file. ); Получает текущую длину файла.



Преобразует их в нижний регистр. for{char *p=str; *р; Р++) *р = tolower(*p);

return ! stronp { http , str) ;

В листинге 5.1 определены два класса. Первый, dlexc, - класс, в котором инкапсулированы все исключения, генерируемые загрузчиком. Конструктор класса dlexc получает указатель на строку, описывающую исключение, и сохраняет ее. Указатель на сообщение об ошибке получается с помощью вызова функции-члена класса geterr ().

Второй класс - Download - обеспечивает зафузку файлов из Интернета. Обратите внимание на то, что этот класс состоит только из статических (static) функций. Следовательно, создание этого класса - скорее организационный прием, чем средство для инкапсуляции. Действительно, в данном случае можно было обойтись пространством имен вместо описания класса. Однако применение класса позволяет объявить некоторые функции со спецификатором доступа private, тем самым препятствуя их использованию в другом коде, и облегчает включение новых функциональных возможностей в дальнейшем.

В следующих разделах подробно обсуждается класс Download.

Принцип действия

Режде чем анализировать различные фрагменты кода описания класса Pownioad, хорошо бы понять его принцип действия. Для зафузки файла из Интернета его URL-адрес передается как параметр в функцию downioadO. сли на диске нет файла с тем же именем, то он зафужается полностью, ли же частично зафуженный файл с таким же именем есть на диске, то Сгружается только остаток файла. Именно способность зафужать остаток файла делает возможным возобновление зафузки из Интернета, которая Ь1ла прервана.

return fout.tellp();

Подтверждает, что в URL задан HTTP. ool Download::ishttp(char *url) { char str[5] =

Получает первые 4 символа из URL. stmcpy(str, url, 4);



Для выполнения частичной зафузки класс Download использует заголовок Range (заголовок интервала) - средство протокола HTTP версий 1.1 и более поздних, позволяющее зафужать область или интервал данных. Следовательно, загрузчик работает только с URL-адресами, которые поддерживают протокол HTTP версий 1.1 и новее. Именно заголовок Range позволяет возобновить прерванную зафузку файла из Интернета с той точки, в которой она прекратилась. Поскольку требуется протокол HTTP версии 1.1, зафузчик поддерживает только НТТР-зафузки.

Если речь идет о запросе HTTP, заголовком (header) называют информацию, его сопровождающую. Заголовок Range - это строка следующего вида:

Range:bytes=start-end

Здесь start задает начало интервала, а end - его конец. Если элемент end отсутствует, интервал начинается от точки start и заканчивается в конце файла.

В классе Download СО спецификатором доступа public определена одна функция - downioado, которая вызывается для зафузки файла из Интернета. Таким образом, она служит точкой входа для зафузки. Кроме того, в классе Download описаны четыре вспомогательные функции, перечисленные в табл. 5.2.

Таблица 5.2. Перечень вспомогательных функций класса Download Название функции Назначение

ishttp Определяет, поддерживается ли для URL-адреса HTTP-запрос ht tpverOK Определяет, используется ли версия протокола HTTP 1.1 и вЫше get fname Получает имя файла как часть строки URL-адреса openf ile Открывает заданный файл на диске и возвращает его длину, которая больше нуля, если уже была частичная зафузка

Эти вспомогательные функции описаны со спецификатором доступа private В теле КЛасса Download.

Функция downloadO

Это единственная функция класса Download, описанная со спецификатором

доступа public. Она вызывается в коде пользователя и обеспечивает зафуз-

ку файла из Интернета. Следовательно, для зафузки файла вы вызываете

downloadO. Поскольку она очень важна, рассмотрим каждую строку кода

функции. Она начинается со строк:

bool Download::download(char *url, bool reload,

void (*update) (unsigrned long, unsicrned long)) {



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

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