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