|
Программирование >> Формирование пользовательского контейнера
функция ishttpO jCaK отмечалось, в зафузчике файлов из Интернета поддерживается только загрузка файлов с помошью протокола HTTP. В классе Download для подтверждения указания этого протокола в URL-адресе используется приведенная далее функция ishttpO. Подтверждает, что в URL-адресе задан HTTP, jjool Download: : ishttp(char *url) { char str[5] = Получает первые 4 символа из URL. stmcpy(str, url, 4); Преобразует их в нижний регистр for (char *p=str; *р; р++) *р = tolower(*р); return IstrcitpChttp , str); Действия функции ishttpO понятны. Она просто проверяет, содержат ли первые четыре символа в URL-адресе строку http . Если это так, функция возврашает true, в противном случае - false. Функция httpverOKO функция httpverOKO, приведенная далее, проверяет, поддерживает ли протокол HTTP версии 1Л сервер, обрабатывающий запрос. Возвращает true, если у протокола HTTP версия 1.1 или больше, bool Download: :httpverOK(HINTERNET hlurl) { char str[80]; unsigned long len =79; Получает версию протокола HTTP. if (HttpQueryinfо(hlurl, HTTP QUERY VERSION, &str, &len, NULL)) return false; Сначала проверяет главный номер версии HTTP, char *р = strchr(str, /); P++; if(*p == -О) return false; не может использовать HTTP 0.x Теперь находит начало младшего номера версии http. р = strchr(str, .); Р++; Преобразует в тип int. int minorVerNuiti = atoi (p) ; if (minorVerNLun > 0) return true; return false; Функции httpverOKO передается дескриптор URL-адреса. Далее извлекается версия HTTP (в строковой форме) с помощью вызова функции HttpQueryinfoo для этого дескриптора и задания константы http query version, которая запрашивает информацию о версии. Этот запрос сохраняет строку с номером версии в переменной str. В случае протокола HTTP версии 1.1 строка будет выглядеть следующим образом: НТТР/1.1 функция устанавливает переменную р для указания на символ / с помощью вызова функции strchr о из стандартной библиотеки. Та, в свою очередь, увеличивает указатель р на единицу и подтверждает, что он ссылается на цифру, отличную от нуля. Далее находится указатель на точку, отделяющую номер главной версии от номера подверсии, и затем указатель перемещается для ссылки на начало числа, следующего за точкой. В завершение, это строковое значение с помощью стандартной библиотечной функции atoi о преобразуется в целое число. Если номер подверсии не меньше 1, версия протокола HTTP не меньше 1.1. Функция getfnameO Функция getfnameO, Приведенная далее, извлекает имя файла из URL-адреса. Выделяет имя файла из url-адреса. Возвращает false, если имя файла не может быть найдено. bool Download::getfname(char *url, char *fname) { Находит последний слэш (/). char *p = strrchr(url, /); Копирует имя файла после последнего знака /. if(р && (Strlen(p) < max filename size)) { Функция openfileO Функция openfileO открывает на диске файл, в который будет записан файл, зафужаемый из Интернета. Она также возврашает длину любого уже имеющегося на диске файла с тем же именем. Далее приведен код функции. Открывает файл вьюода, инициализирует поток вывода и возврашает длину файла. Если reload имеет значение true, сначала укорачивается до нуля любой уже существующий файл. unsigned long Download::openfile(char *url, bool reload, ofstream &fout) { char fname[MAX FILENAME SIZE] ; if {! 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: : trxmc) ; if(!fout) Р++; strcpy (fname, р) ; return true; else return false; В функцию передается указатель на строку, содержащую URL-адрес, и указатель на символьный массив, в котором будет храниться имя файла после завершения функции. Предполагается, что имя файла - это часть URL-адреса между последним символом / и концом строки. Функция возвращает true в случае успешного завершения, и false, если имя файла не может быть найдено.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |